Algorithm 在数组中排列数字,使所有负值出现在所有正值之前,所需的最小交换次数是多少?

Algorithm 在数组中排列数字,使所有负值出现在所有正值之前,所需的最小交换次数是多少?,algorithm,Algorithm,假设我们想要排列存储在任何数组中的n个数字,使得所有负值出现在所有正值之前。那么,如何在最坏的情况下找到所需的最小交换次数呢?您可以使用双指针方法 首先将所有负数移动到位,然后计算所需的交换次数 将末端的所有负数移动到位,并计算所需的交换次数 比较这些交换次数以获得最小交换次数 这里是C++实现: int minimumExchange(vector<int>& arr) { int result = INT_MAX; int coun

假设我们想要排列存储在任何数组中的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;
    }
您可以找到工作代码


时间复杂度取决于其中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 而jconsole.log--;N/2͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏。你可以阅读更多关于。