题解 | #数组中的逆序对#

数组中的逆序对

https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5

利用分治思想对比递归和非递归两种思路。

  • 注释为递归算法

  • 计数得用unsigned int类型存储,否则会溢出,无法通过最后一个案例。

  • 利用do while语句实现非递归
    具体思路为按步从2,4,8,每次翻倍直接进行分治。
    在一步中利用辅助空间vector vec进行排序。

    class Solution {
    public:
      /*
      int mergeSort(int left, int right, vector& data, vector& temp) {
          if (left >= right) return 0;
          int mid = left + ((right - left) >> 1);
          unsigned int ans = mergeSort(left, mid, data, temp) +
                    mergeSort(mid + 1, right, data, temp);
    
          int i = left, j = mid + 1;
          for (int k = left; k <= right; k++)
              temp[k] = data[k];
          for (int k = left; k <= right; k++) {
              if (i > mid)
                  data[k] = temp[j++];
              else if (j > right or temp[i]<=temp[j])
                  data[k] = temp[i++];
              else {
                  data[k] = temp[j++];
                  ans += mid - i + 1;
              }
          }
          return ans % 1000000007;
      }
      */
    
      int InversePairs(vector data) {
          unsigned int count = 0;
          int n = data.size();
          int step = 2;
          do {
              for (int i = 0; i < n; i += step) {
                  int ii = 0, jj = (step>>1);
                  int end = min(i + step,n);
                  int mid = jj;
                  vector vec(data.begin()+i,data.begin()+end);
                  if (jj>=vec.size()) continue;
                  for(int k=i;k<end;k++){
                      if (ii==mid) data[k]==vec[jj++];
                      else if(vec[ii]<=vec[jj] or jj==(end-i)){
                          data[k]=vec[ii++];
                      } else {
                          data[k]=vec[jj++];
                          count += mid - ii;
                      }
                  }
              }
              step <<= 1;
          } while (step < 2*n);
          return  count % (1000000007);
          /*
          vector res(data.size());
          return mergeSort(0, data.size() - 1, data, res);
          */
      }
    

};
```

全部评论

相关推荐

ResourceUtilization:算法很难了,现在都需要相关论文还有对应的实习,可以先试试中厂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务