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