美文网首页
01-小和问题

01-小和问题

作者: ShawnCaffeine | 来源:发表于2019-10-13 22:31 被阅读0次

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

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

问题求解:

首先描述Merge的过程。

类似于外排序,时间复杂度为O(n)。
例如A[]={1,3,4},B[]={2,5},
A和B进行Merge时,有两个指针分别指向A[0]位置和B[0]位置,且生成一个辅助数组Help[A.length+B.length],例子中即为Help[5]。
首先依次比较A[0]和B[0]的大小,谁小填入Help数组中,且填入后该指针向后移动一位,直至任一指针到达数组边界,然后将另一个数组的未填入的数组全部填入Help数组中。最后,将Help数组的数据拷贝至原数组的位置,形成有序的序列。

由于Merge的过程中要对Merge的两个数组进行了比较,小和可以在Merge的过程中计算。
考虑使用归并排序解决。归并排序采用分治法,首先将一个数组分成左右规模相同的两个数组,再分,再分,直至分出的数组只有一个数字。接了来就是Merge的过程,通过外排序的方式依次拷贝数据至一个辅助数组中,如果左边数字较小,右边数字较大,此时产生小和。在进行组间Merge时,左右指针依次移动,如果左指针上的数字比右指针上的数字小,则产生(左指针上数字)*(右指针至边界数字的个数)的小和。如图所示,此处产生的小和为1*2=2。


求小和

上代码

package Sort;

public class SmallSum {
    public static int smallSum(int[] arr){
        if (arr.length<2&&arr==null){
            return 0;
        }
        return mergeSort(arr,0,arr.length-1);
    }
    public static int mergeSort(int[] arr,int L,int R){
        if(L==R){
           return 0;
        }
        int mid=L+((R-L)>>1);
        return mergeSort(arr,L,mid)
                +mergeSort(arr,mid+1,R)
                +merge(arr,L,mid,R);
    }

    private static int merge(int[] arr, int l, int mid, int r) {
        int[] help=new int[r-l+1];
        int p1=l;
        int p2=mid+1;
        int i=0;
        int res=0;
        while (p1<=mid&&p2<=r){
            res+=arr[p1]<arr[p2]?arr[p1]*(r-p2+1):0;
            help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
        }
        while (p1<=mid){
            help[i++]=arr[p1++];
        }
        while (p2<=r){
            help[i++]=arr[p2++];
        }
        for (i=0;i<help.length;i++){
            arr[l+i]=help[i];
        }
        return res;
    }
}

相关文章

  • 01-小和问题

    问题描述:在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组 的小和。 例子: [1...

  • 为什么我们的关系只能停留在男女朋友阶段,就结束了

    -01- 最近有一位朋友小丽和我抱怨了一个问题:小丽和男朋友已经交往有一年多了,但是最近男朋友和她说:“为了我们的...

  • 小和问题

    小和问题 在一个数组中,每一个元素左边比当前元素值小的元素值累加起来,叫做这个数组的小和例如:[2,3,4,1,5...

  • 小和问题

    小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。例子:[1,3,4...

  • 01-背包、完全背包、多重背包及其相关应用

    本文介绍了背包问题系列,主要包括: 【1】 01-背包及其应用【2】完全背包及其应用【3】多重背包 【1】01-背...

  • 你有多“土”,就会有多穷(深度长文)

    -01- 首先问大家两个问题: 1)为什么爬树和种田最厉害的人,高考不能加分,而作文写得...

  • 小故事01-买菜

    每年的春节都要买好多菜,家家如此,我家当然也不例外。而农村出生长大的老妈就是买菜的主力啦! 老妈跟我婶一起去市集买...

  • 小程序01-初识

    本来之前就想学习下小程序,一直工作忙活就没怎么看,上周正好领导让我开始学习小程序,那就正好趁这个时候没项目做就认真...

  • 两个自卑的人,要怎么相爱

    -01- 苏瑾从小就有点自卑。 一开始,她以为自己的问题出在长相上。 苏瑾不算美女,皮肤是小麦色,眼睛有点小,笑起...

  • 懂得反省,才会成长更快。

    文/糖小果 -01- 在交流群里当了个助教,每周定时解答问题。昨晚有个学员找我私聊解决问题,我解答了一部分,大概有...

网友评论

      本文标题:01-小和问题

      本文链接:https://www.haomeiwen.com/subject/dbvkmctx.html