Java 小和问题

这题明明就是一个计数题,活生生变成了排序,为什么排序后还可以进行计数而不影响计数结果,因为排序之前大的那部分已经计算过了,以后的递归过程已经调用不到了,所以排序不会影响后面的计数

具体代码如下:

  1 public class SmallSum {
  2 
  3     public static int smallSum(int[] arr) {
  4         if (arr == null || arr.length < 2) {
  5             return 0;
  6         }
  7         return mergeSort(arr, 0, arr.length - 1);
  8     }
  9 
 10     public static int mergeSort(int[] arr, int l, int r) {
 11         if (l == r) {
 12             return 0;
 13         }
 14         int mid = l + ((r - l) >> 1);
 15         return mergeSort(arr, l, mid) + mergeSort(arr, mid + 1, r) + merge(arr, l, mid, r);
 16     }
 17 
 18     public static int merge(int[] arr, int l, int m, int r) {
 19         int[] help = new int[r - l + 1];
 20         int i = 0;
 21         int p1 = l;
 22         int p2 = m + 1;
 23         int res = 0;
 24         while (p1 <= m && p2 <= r) {
 25             res += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p1] : 0;
 26             help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
 27         }
 28         while (p1 <= m) {
 29             help[i++] = arr[p1++];
 30         }
 31         while (p2 <= r) {
 32             help[i++] = arr[p2++];
 33         }
 34         for (i = 0; i < help.length; i++) {
 35             arr[l + i] = help[i];
 36         }
 37         return res;
 38     }
 39 
 40     // for test
 41     public static int comparator(int[] arr) {
 42         if (arr == null || arr.length < 2) {
 43             return 0;
 44         }
 45         int res = 0;
 46         for (int i = 1; i < arr.length; i++) {
 47             for (int j = 0; j < i; j++) {
 48                 res += arr[j] < arr[i] ? arr[j] : 0;
 49             }
 50         }
 51         return res;
 52     }
 53 
 54     // for test
 55     public static int[] generateRandomArray(int maxSize, int maxValue) {
 56         int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
 57         for (int i = 0; i < arr.length; i++) {
 58             arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
 59         }
 60         return arr;
 61     }
 62 
 63     // for test
 64     public static int[] copyArray(int[] arr) {
 65         if (arr == null) {
 66             return null;
 67         }
 68         int[] res = new int[arr.length];
 69         for (int i = 0; i < arr.length; i++) {
 70             res[i] = arr[i];
 71         }
 72         return res;
 73     }
 74 
 75     // for test
 76     public static boolean isEqual(int[] arr1, int[] arr2) {
 77         if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
 78             return false;
 79         }
 80         if (arr1 == null && arr2 == null) {
 81             return true;
 82         }
 83         if (arr1.length != arr2.length) {
 84             return false;
 85         }
 86         for (int i = 0; i < arr1.length; i++) {
 87             if (arr1[i] != arr2[i]) {
 88                 return false;
 89             }
 90         }
 91         return true;
 92     }
 93 
 94     // for test
 95     public static void printArray(int[] arr) {
 96         if (arr == null) {
 97             return;
 98         }
 99         for (int i = 0; i < arr.length; i++) {
100             System.out.print(arr[i] + " ");
101         }
102         System.out.println();
103     }
104 
105     // for test
106     public static void main(String[] args) {
107         int testTime = 500000;
108         int maxSize = 100;
109         int maxValue = 100;
110         boolean succeed = true;
111         for (int i = 0; i < testTime; i++) {
112             int[] arr1 = generateRandomArray(maxSize, maxValue);
113             int[] arr2 = copyArray(arr1);
114             if (smallSum(arr1) != comparator(arr2)) {
115                 succeed = false;
116                 printArray(arr1);
117                 printArray(arr2);
118                 break;
119             }
120         }
121         System.out.println(succeed ? "Nice!" : "Fucking fucked!");
122     }
123 
124 }

猜你喜欢

转载自www.cnblogs.com/leio123/p/11108312.html