C++ 用分治算法求逆序数

已知数组nums,求新数组count,count[i]代表了在nums[i]右侧比nums[i]小的元素个数。
例如:
nums=[5,2,6,1],count=[2,1,1,0];
nums=[6,6,6,1,1,1], count=[3,3,3,0,0,0];
nums=[5,-7,9,1,3,5,-2,1], count=[5,0,5,1,2,2,0,0];

#include<vector>
class Solution
{
public:
 Solution() {};
 ~Solution() {};
 std::vector<int> countSmaller(std::vector<int>& nums)
 {
  std::vector<std::pair<int, int>> vec;
  std::vector<int> count;
  for (int i = 0; i < nums.size(); i++)
  {
   vec.push_back(std::make_pair(nums[i],i));
   count.push_back(0);
  }
  merge_sort(vec,count);
  return count;
 }
private:
 void merge_sort_two_vec
    (std::vector<std::pair<int, int>>& sub_vec1,
  std::vector<std::pair<int, int>>& sub_vec2,
  std::vector<std::pair<int, int>>& vec,
  std::vector<int> &count)
 {
  int i = 0;
  int j = 0;
  while (i<sub_vec1.size()&&j<sub_vec2.size())
  {
   if (sub_vec1[i].first<=sub_vec2[j].first)
   {
    vec.push_back(sub_vec1[i]);
    count[sub_vec1[i].second] += j;
    i++;
   }
   else
   {
    vec.push_back(sub_vec2[j]);
    j++;
   }
  }
  for (;  i< sub_vec1.size(); i++)
  {
   vec.push_back(sub_vec1[i]);
   count[sub_vec1[i].second] += j;
  }
  for (; j < sub_vec2.size(); j++)
  {
   vec.push_back(sub_vec2[j]);
  }
 }
 void merge_sort(std::vector<std::pair<int,int>>&vec,
  std::vector<int>& count)
 {
  if (vec.size()<2)
  {
   return;
  }
  int mid = vec.size() / 2;
  std::vector<std::pair<int, int>> sub_vec1;
  std::vector<std::pair<int, int>> sub_vec2;
  for (int i = 0; i < mid; i++)
  {
   sub_vec1.push_back(vec[i]);
  }
  for (int i = mid; i < vec.size(); i++)
  {
   sub_vec2.push_back(vec[i]);
  }
  merge_sort(sub_vec1,count);
  merge_sort(sub_vec2,count);
  vec.clear();
  merge_sort_two_vec(sub_vec1,sub_vec2,vec,count);
 }
};
int main()
{
 int test[] = {5,-7,9,1,3,5,-2,1};
 std::vector<int> nums;
 for (int i = 0; i < sizeof(test)/sizeof(test[0]); i++)
 {
  nums.push_back(test[i]);
 }
 Solution solve; 
 std::vector<int> result = solve.countSmaller(nums);
 for (int i = 0; i < result.size(); i++)
 {
  printf("[%d]",result[i]);
 }
 return 0;
}

运行结果为:

[5][0][5][1][2][2][0][0]
发布了61 篇原创文章 · 获赞 46 · 访问量 1582

猜你喜欢

转载自blog.csdn.net/weixin_44208324/article/details/104875459
今日推荐