当前位置:   article > 正文

06、小和问题_c++在一个数组中,每一个数左边比当前数小(不包括相等的情况)的数累加起来,叫做这

c++在一个数组中,每一个数左边比当前数小(不包括相等的情况)的数累加起来,叫做这

一、小和问题

1.1 问题简介

        在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组
的小和。

         例子:如数组[1,3,6,2,5]

        1左边比1小的数,没有;
        3左边比3小的数,1;
        6左边比4小的数,1、3;
        2左边比2小的数,1;
        5左边比5小的数,1、3、2;
        所以小和为1+1+3+1+1+3+2=12

1.2 思路

常规解法,进行两次for循环嵌套,时间复杂度为:O(N²)。通过归并排序的方法将时间复杂度降到O(nlogn)。

        归并排序分两步,一是,二是。分好说,不停的将数组划分为两部分。(可以看前一篇笔记05、归并排序及其复杂度分析_ZHY_ERIC的博客-CSDN博客

        如下图:

        如上图,对数组进行,接下来是治:

        (1)首先1和3进行merge,在此过程中产生小和1

        (2)然后1,3和6进行merge,在此过程产生小和1和3

        (3)然后2和5进行merge,在此过程产生小和2

        (4)最后1,3,6和2,5进行merge,

               1比2,5的小和2小,一共产生n个1的小和,n就是当前右边数的个数,这里是2.所以产生2个1的小和,将1填入辅助数组。

               接着3和2比较,3>2,但是2是右边的数,不算小和。然后3和5比较,3<5,产生n个3的小和,因为此时右边只有一个数,n=1,故产生1个3的小和。

               接着6和2比较,6>2,不产生小和。6和5比较,6>5,不产生小和。

 1.3 代码

  1. package basic_package_01;
  2. public class Code_12_SmallSum {
  3. public static int smallSum(int[] arr) {
  4. if (arr == null || arr.length < 2) {
  5. return 0;
  6. }
  7. return mergeSort(arr, 0, arr.length - 1);
  8. }
  9. public static int mergeSort(int[] arr, int l, int r) {
  10. if (l == r) {
  11. return 0;
  12. }
  13. int mid = l + ((r - l) >> 1);
  14. System.out.println("下标号:"+mid+"数值:"+arr[mid]);
  15. return mergeSort(arr, l, mid) + mergeSort(arr, mid + 1, r) + merge(arr, l, mid, r);
  16. }
  17. public static int merge(int[] arr, int l, int m, int r) {
  18. int[] help = new int[r - l + 1];
  19. int i = 0;
  20. int p1 = l;
  21. int p2 = m + 1;
  22. int res = 0;
  23. while (p1 <= m && p2 <= r) {
  24. res += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p1] : 0;
  25. help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
  26. }
  27. while (p1 <= m) {
  28. help[i++] = arr[p1++];
  29. }
  30. while (p2 <= r) {
  31. help[i++] = arr[p2++];
  32. }
  33. for (i = 0; i < help.length; i++) {
  34. arr[l + i] = help[i];
  35. }
  36. return res;
  37. }
  38. // for test
  39. public static void printArray(int[] arr) {
  40. if (arr == null) {
  41. return;
  42. }
  43. for (int i = 0; i < arr.length; i++) {
  44. System.out.print(arr[i] + " ");
  45. }
  46. System.out.println();
  47. }
  48. public static void main(String[] args) {
  49. int[] arr = {1,3,6,2,5};
  50. System.out.print(smallSum(arr));
  51. }
  52. }

结果:

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

闽ICP备14008679号