Algorithm 在数组中排列数字,使所有负值出现在所有正值之前,所需的最小交换次数是多少?
假设我们想要排列存储在任何数组中的n个数字,使得所有负值出现在所有正值之前。那么,如何在最坏的情况下找到所需的最小交换次数呢?您可以使用双指针方法 首先将所有负数移动到位,然后计算所需的交换次数 将末端的所有负数移动到位,并计算所需的交换次数 比较这些交换次数以获得最小交换次数Algorithm 在数组中排列数字,使所有负值出现在所有正值之前,所需的最小交换次数是多少?,algorithm,Algorithm,假设我们想要排列存储在任何数组中的n个数字,使得所有负值出现在所有正值之前。那么,如何在最坏的情况下找到所需的最小交换次数呢?您可以使用双指针方法 首先将所有负数移动到位,然后计算所需的交换次数 将末端的所有负数移动到位,并计算所需的交换次数 比较这些交换次数以获得最小交换次数 这里是C++实现: int minimumExchange(vector<int>& arr) { int result = INT_MAX; int coun
这里是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;
}
您可以找到工作代码
时间复杂度取决于其中n是数组的大小。您只需要处理一半的项 想象一个包含6个元素的列表。在可能的最坏情况下,所有负数都在正数之后:
1,2,3,-1,-2,-3
要解决此问题,您需要两个指针:
+1,+2,+3,-1,-2,-3
^ ^
i j
当它迭代3次时:
-1,+2,+3,+1,-2,-3
^ ^
-1,-2,+3,+1,+2,-3
^ ^
-1,-2,-3,+1,+2,+3
^ ^
因此,您的解决方案是:
let X be your list
let i = 0
let j0 = len(X)/2 + 1, rounded down
let j = j0
while j < len(X)
if X[i] < 0
i ++
else if X[j] < 0
swap X[i] with X[j]
i ++
j ++
else
j ++
函数printListlist,i,j{
让STR= List.Max,席= > {
若席==i {
返回[+x+];
}如果席=jj
回来
}否则{
返回x;
}
}.加入;
console.logstr;
}
函数fooX{
设i=0
设j0=Math.floorX.length/2
设j=j0
而j