当前位置:   article > 正文

算法之路_6、小和问题_小和。是

小和。是

一、问题

小和问题

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

例子: [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

 

二、解析

通过以上例子大致可以看出需要解决那些问题。我们算法中需要找到每一个数左边,比他小的数之和,然后计算每个数的小和之和。解决这个问题最简单粗暴的就是遍历,大致思想就是遍历每一个数,然后遍历每个数左侧比他小的数,并且计算和。最后计算总体小和。这样的算法的时间复杂度也很明显--O(N^2)。我们在前面的博文中介绍了递归思想,归并思想以及相应的算法。小和问题可以采用归并思想。

分析:(看不懂的同学可以往前翻阅递归以及归并两篇博文)

将数据样本按归并思想分为左右两部分,计算小和,最后归并时计算总体小和。(这里说的或许有些抽象,大家可以看看代码再做相应的理解)

三、代码

  1. package algorithm;
  2. /*
  3. *2019年1月9日
  4. */
  5. public class SmallSum {
  6. public static int smallSum(int arr[]){
  7. //若数组为空或者只有一个元素 则直接返回0
  8. if (arr==null&&arr.length<2) {
  9. return 0;
  10. }
  11. return mergeSort(arr,0,arr.length-1);
  12. }
  13. public static int mergeSort(int[] arr, int l, int r) {
  14. //递归出口 当左右相等时 即只有一个元素时 返回0
  15. if (l==r) {
  16. return 0;
  17. }
  18. int mid=l+((r-l)>>1);
  19. //递归思想:左侧小和 +右侧小和 + 整体
  20. return mergeSort(arr, l, mid)
  21. +mergeSort(arr, mid+1, r)
  22. +merge(arr, l,mid, r);
  23. }
  24. public static int merge(int[] arr, int l, int mid, int r) {//最重要的求小和部分(归并部分)
  25. int help[]=new int[r-l+1];//辅助数组
  26. int i=0;
  27. int res=0;//记录小和
  28. int p1=l;//左边区域指针
  29. int p2=mid+1;//左边区域指针
  30. while (p1<=mid&&p2<=r) {
  31. /*
  32. * 此时左右区域元素皆有序 所以 右区域所指元素大于左区域所指元素时
  33. * 表明右区域所有元素都比左区域所指元素大 则小和+右区域元素个数*左区域所指元素
  34. */
  35. res+=arr[p1]<arr[p2]?(r-p2+1)*arr[p1]:0;
  36. //归并排序部分代码
  37. help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
  38. }
  39. while(p2<=r){
  40. help[i++]=arr[p2++];
  41. }
  42. while(p1<=mid){
  43. help[i++]=arr[p1++];
  44. }
  45. for (int j = 0; j < help.length; j++) {
  46. arr[l+j]=help[j];
  47. }
  48. return res;//返回当前数组区域的小和
  49. }
  50. public static void main(String[] args) {
  51. //测试
  52. int arr[]={1,1,2,3};
  53. System.out.println(smallSum(arr));
  54. }
  55. }

四、算法时间复杂度

同上篇归并排序算法博文。

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

闽ICP备14008679号