当前位置:   article > 正文

小和问题(C++实现)_c++数组小和

c++数组小和

归并求小和  在数组中求小和,既要排好序,也要求小和
小和:在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和

用归并来实现


例子
[1,3,4,2,5]
1左边比1小的数:没有
3左边比3小的数:1
4左边比4小的数:1,3
2左边比2小的数:1
5左边比5小的数:1,3,4,2
所以小和为1+1+3+1+1+3+4+2=16
 

代码如下:

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int process(vector<int>& arr, int L, int R);
  5. int merge(vector<int>& arr, int L, int M, int R);
  6. int smallSum(vector<int>& arr)//小和函数
  7. {
  8. if (arr.empty())
  9. {
  10. return 0;
  11. }
  12. return process(arr, 0, arr.size() - 1);
  13. }
  14. int process(vector<int>& arr, int L, int R)
  15. {
  16. if (L == R)
  17. {
  18. return 0;
  19. }
  20. int mid = L + ((R - L) >> 1);
  21. return process(arr, L, mid) + process(arr, mid + 1, R) + merge(arr, L, mid, R);
  22. //小和等于左边排好序求小和+右边排好序求小和+merge求小和的结果
  23. }
  24. int merge(vector<int>& arr,int L,int M,int R)
  25. {
  26. vector<int>help;//创建一个辅助数组
  27. help.resize(R - L + 1);//开辟和arr一样的大小
  28. int i = 0, p1 = L, p2 = M + 1, res = 0;//res来接收小和
  29. while (p1 <= M && p2 <= R)
  30. {
  31. res += arr[p1] < arr[p2] ? (R - p2 + 1) * arr[p1] : 0;//小和+=
  32. help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];//用一个临时数组来排序
  33. }
  34. while (p1 <= M)//如果右边临界了,把左边加入到辅助数组中
  35. {
  36. help[i++] = arr[p1++];
  37. }
  38. while (p2 <= R)//如果左边临界了 把右边加入到辅助数组中,上下只会中一个情况
  39. {
  40. help[i++] = arr[p2++];
  41. }
  42. for (int k = 0; k < help.size(); k++)//把临时数组倒回原数组
  43. {
  44. arr[L + k] = help[k];
  45. }
  46. return res;//返回小和
  47. }
  48. int main()
  49. {
  50. //测试
  51. vector<int>v;
  52. v.push_back(1);
  53. v.push_back(3);
  54. v.push_back(4);
  55. v.push_back(2);
  56. v.push_back(5);
  57. cout << smallSum(v) << endl;//输出v数组的小和
  58. for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//输出排好序的数组
  59. {
  60. cout << *it << " ";
  61. }
  62. cout << endl;
  63. return 0;
  64. }

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

闽ICP备14008679号