当前位置:   article > 正文

c++用归并排序计算右侧小于当前元素个数_c++ 计算右侧小于当前元素的个数 归并排序

c++ 计算右侧小于当前元素的个数 归并排序
  1. class Solution {
  2. public:
  3. vector<int> countSmaller(vector<int>& nums) {
  4. vector<pair<int, int>> array(nums.size());
  5. count.resize(nums.size(), 0);
  6. for(int i=0; i<nums.size(); i++){
  7. array[i] = {i, nums[i]};
  8. }
  9. tmp.resize(nums.size());
  10. sort(array, 0, nums.size()-1);
  11. return count;
  12. }
  13. vector<pair<int, int>> tmp;
  14. vector<int> count;
  15. void sort(vector<pair<int, int>>& array, int lo, int hi){
  16. if(lo >= hi) return;
  17. int mid = (lo + hi) >> 1;
  18. sort(array, lo, mid);
  19. sort(array, mid+1, hi);
  20. merge(array, lo, mid, hi);
  21. }
  22. void merge(vector<pair<int, int>>& array, int lo, int mid, int hi){
  23. for(int i=lo; i<=hi; i++){
  24. tmp[i] = array[i];
  25. }
  26. int i = lo;
  27. int j = mid+1;
  28. for(int p=lo; p<=hi; p++){
  29. if(i == mid+1){
  30. array[p] = tmp[j++];
  31. }
  32. else if(j == hi+1){
  33. array[p] = tmp[i++];
  34. count[array[p].first] += j-mid-1;
  35. }
  36. else if(tmp[i].second > tmp[j].second){
  37. array[p] = tmp[j++];
  38. }
  39. else if(tmp[i].second <= tmp[j].second){
  40. array[p] = tmp[i++];
  41. count[array[p].first] += j-mid-1;
  42. }
  43. }
  44. }
  45. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/227541
推荐阅读
相关标签
  

闽ICP备14008679号