算法总结之 计算数组最小和

本文介绍了一种利用归并排序思想解决数组中每个元素左侧比其小的元素总和问题的方法,并提供了详细的Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法总结之 计算数组最小和

一个数组中 每个元素左边比他小的和  然后都加起来

这个题目非常牛逼,可以用归并加速法,在归并的过程中做文章!!!

    代码展示:

  

package TT;

public class Test73 {
 
     public static int getSmallSum(int[] arr){
         if(arr==null || arr.length==0){
             return 0 ;
         }
         
         return func(arr, 0, arr.length-1);
         
     }
     
     public static int func(int[] s, int l, int r){
         if(l==r){
             return 0;
         }
         int mid = (l+r)/2;
         return func(s, l, mid) + func(s, mid+1, r)+merge(s,l,mid,r);
     }
     
     public static int merge(int[] s, int left, int mid, int right){
         
            int[] h = new int[right-left+1];
            int hi = 0;
            int i =left;
            int j =mid+1;
            int smallSum = 0;
            while (i<=mid && j<=right) {
                if(s[i]<=s[j]){
                    smallSum +=s[i]*(right-j+1);
                    h[hi++]=s[i++];
                }else {
                    h[hi++]=s[j++];
                }
                
            }
            
            for( ;((j<right+1) ||(i<mid+1)); j++, i++){
                h[hi++]= i>mid ?s[j]:s[i];
            }
            for(int k=0; k!=h.length; k++){
                s[left++]=h[k];
            }
            return smallSum;
     }
     
     
     public static void main(String[] args){
         
         int[] arr = new int[6];
         arr[0]=1;
         arr[1]=3;
         arr[2]=5;
         arr[3]=2;
         arr[4]=4;
         arr[5]=6;
         
         int x =getSmallSum(arr);
         System.out.println(x);
     }
     
     
     
     
}

结果:

 

 

 

   

posted @ 2017-09-07 17:32 toov5 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值