今天遇到的坑

很奇怪,我感觉我的代码没问题,看了别人的代码我还帮他改了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;


    }
原文地址:https://www.cnblogs.com/huayecai/p/10553975.html