当前位置:   article > 正文

算法之小和问题_算法 小和

算法 小和

问题描述:

在一个数组中,每一个数的左边比当前数小的数累加起来,叫做这个数组的小和,求一个数组的小和。
例子:[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. public class XiaoHe {
  2. public static int process(int[] arr, int L, int R){
  3. if(L == R){
  4. return 0;
  5. }
  6. int Mid = (L + R) / 2;
  7. return process(arr, L, Mid) + process(arr, Mid+1, R) + Merge(arr, L, Mid, R);
  8. }
  9. public static int Merge(int[] arr, int L, int Mid, int R){
  10. int[] help = new int[R - L + 1];
  11. int i = 0;
  12. int p1 = L;
  13. int p2 = Mid + 1;
  14. int res = 0;
  15. while(p1 <= Mid && p2 <= R){
  16. if(arr[p1] < arr[p2]){
  17. res += arr[p1]*(R - p2 + 1);
  18. help[i++] = arr[p1++];
  19. }else{
  20. help[i++] = arr[p2++];
  21. }
  22. }
  23. while(p1 <= Mid){
  24. help[i++] = arr[p1++];
  25. }
  26. while(p2 <= R){
  27. help[i++] = arr[p2++];
  28. }
  29. for(i = 0;i < help.length;i++){
  30. arr[L+i] = help[i];
  31. }
  32. return res;
  33. }
  34. public static int smallSum(int[] arr){ //这一步是多余的。可以省略。
  35. return process(arr, 0, arr.length - 1);
  36. }
  37. public static void main(String[] args) {
  38. int[] arr = {1,3,4,2,5};
  39. System.out.println(smallSum(arr));
  40. }
  41. }

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

闽ICP备14008679号