algorithm - 排列数组中的数字以使所有负值出现在所有正值之前,最少需要多少次交换?
问题描述
假设我们想要排列存储在任何数组中的 n 个数字,使得所有负值都出现在所有正值之前。那么如何找到在最坏情况下所需的最小交换次数?
解决方案
您可以使用两个指针方法。
首先将所有负数移动到位并计算所需的交换次数
将最后的所有负数移动到位并计算所需的交换次数
比较这些交换次数以获得最小交换次数。
这是 C++ 实现:
int minimumExchange(vector<int>& arr) {
int result = INT_MAX;
int countFirst = 0, countLast = 0;
int n = arr.size();
vector<int> tmp(arr);
int left = 0, right = 0;
while(right < n) {
if(arr[right] < 0) {
swap(arr[left], arr[right]);
if(left != right) countFirst++;
left++;
}
right++;
}
arr = tmp;
left = n - 1, right = n - 1;
while(right >= 0) {
if(arr[right] < 0) {
swap(arr[left], arr[right]);
if(left != right) countLast++;
left--;
}
right--;
}
result = min(countFirst, countLast);
return result;
}
你可以在这里找到工作代码。
时间复杂度是O(n)
数组n
的大小。
推荐阅读
- jolt - 空元素的颠簸转换问题
- wpf - ListView 扩展器在过滤器搜索上重置
- python - 即使元素不存在,Selenium 也会继续脚本
- python - 比较2个字典并提取python中的其他值
- c - 我被困在循环条件中使用的错误变量'n'和'm'没有在循环体中修改
- java - 如何登录到字符串?有没有办法将每个控制台输出捕获到单个字符串中?
- c# - 以 uint16 格式检索 WMI 查询信息 c#
- google-apps-script - 在新的脚本编辑器中为 Google 表格创建和测试插件
- python - 滚动一个在 Python 中使用 Selenium 进一步加载的元素
- c# - 并行运行异步查询 (IAsyncEnumerable)