• 今天遇到的坑


    很奇怪,我感觉我的代码没问题,看了别人的代码我还帮他改了bug,结果他跑出来时正确的我的就有问题?

    首先上正确的代码

    import java.util.Arrays;
    
    public class littlesum {
    
    
        public static int mergeSortSum(int[] arr){
            if(null == arr || arr.length < 2){
                return 0;
            }
            // 排序并返回最小和
            return mergeSortSumTest(arr,0,arr.length-1);
    
        }
    
        public static int mergeSortSumTest(int[] arr, int L, int R) {
            if(L == R ) {
                return 0;
            }
            int mid = L + (R -L) /2;
            // 左边的最小和+右边的最小和+最后排序好的最小和就是最后的结果
            return mergeSortSumTest(arr, L, mid) + mergeSortSumTest(arr, mid+1, R) + mergeSortSumArray(arr,L,mid,R);
        }
    
        public static int mergeSortSumArray(int[] arr, int l, int mid, int r) {
            int[] arrs = new int[r-l+1];
            int i = 0;
            int p1 = l;
            int p2 = mid + 1;
            int sum = 0;// 最小和
    
            while(p1<=mid && p2 <= r){
                // 如果左边小于右边,那就有(r - p2 + 1)个arr[p1]元素的和是最小和
                // 如果大于右边,返回0
                sum += arr[p1] < arr[p2]?(r - p2 + 1)*arr[p1]:0;
               // sum += arr[p1] > arr[p2]?(mid - p1 + 1):0; //求逆序对
                arrs[i++] = arr[p1] < arr[p2]?arr[p1++]:arr[p2++];
            }
    
            while(p1<=mid){
                arrs[i++] = arr[p1++];
            }
    
            while(p2<=r){
                arrs[i++] = arr[p2++];
            }
    
    
            return sum;
        }
    
    
        public static void main(String[] args){
           
            int[] num={1,3,4,2,5};
            System.out.println(mergeSortSum(num));
        }
    
    }
    

     然后是我关于这一部分的代码,明明都一样啊,跑出来结果就是不同,首先说一下这是归并排序小和问题

    public static int merge(int[] num){
    
            if(num==null||num.length<2){
    
                return 0;
            }
    
            return digui(num,0,num.length-1);
    
    
        }
    
        public static int digui(int[] num,int l, int r){
    
        if(l==r){
            return 0;
        }
        int mid=(l+r)/2;
    
            return  digui(num,0,mid)+digui(num,mid+1,r)+guibing(num,mid,l,r);
    
    
        }
        public static int guibing(int[] num,int mid,int l, int r){
    
            int[] help=new int[r-l+1];
            int i=0;
            int n=0;
            int p1=l;
            int p2=mid+1;
            while(p1<=mid && p2<=r){
                n += num[p1]<num[p2]?(r-p2+1)*num[p1]:0;
    
                help[i++]=num[p1]<num[p2]?num[p1++]:num[p2++];
    
            }
            while(p1<=mid){
    
                help[i++]=num[p1++];
            }
            while(p2<=r){
    
                help[i++]=num[p2++];
            }
    //mmp 一个等于号毁了好几个小时,一定要记住数组的范围。。。。小于数组的长度
            for(int j=0;j<help.length;j++){
    
                num[l+j]=help[j];
    
            }
            return n;
    
    
        }
    
  • 相关阅读:
    Codeforces 937D
    Codeforces 458C
    Codeforces 934D
    Codeforces 934C
    Codeforces 36B
    Codeforces 374C
    Codeforces 374D
    编译优化
    Codeforces E
    Codeforces 920G
  • 原文地址:https://www.cnblogs.com/huayecai/p/10553975.html
Copyright © 2020-2023  润新知