当前位置:   article > 正文

13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)_数组每个元素左边比他小的元素最大和

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/227477
推荐阅读
相关标签
  

闽ICP备14008679号