1. import org.junit.jupiter.api.Test;
    2. public class SumMaximumContinuity {
    3. int[] arr = {1,2,3,-6,1};
    4. /**
    5. * 暴力
    6. * @param arr
    7. * @return
    8. */
    9. public int getMaxSum(int[] arr){
    10. int n = arr.length;
    11. int max_sum = arr[0];
    12. for (int i = 0; i < n; i++) {
    13. int cur_sum = 0;
    14. for (int j = i; j < n; j++) {
    15. cur_sum += arr[j];
    16. if (cur_sum>max_sum){
    17. max_sum = cur_sum;
    18. }
    19. }
    20. }
    21. return max_sum;
    22. }
    23. /**
    24. * 动态规划
    25. * @param arr
    26. * @return
    27. */
    28. public int getMaxSumDynamic(int[] arr){
    29. int n = arr.length;
    30. int max_sum = arr[0];
    31. int cur_sum = 0;
    32. for (int i = 0; i < n; i++) {
    33. cur_sum += arr[i];
    34. if (cur_sum > max_sum){
    35. max_sum = cur_sum;
    36. }
    37. if (cur_sum < 0){
    38. cur_sum = 0;
    39. }
    40. }
    41. return max_sum;
    42. }
    43. /**
    44. * 分治法
    45. * @param arr
    46. * @return
    47. */
    48. public int getMaxSumDivide(int[] arr){
    49. int n = arr.length;
    50. return getMaxSumDivide(arr,0,n-1);
    51. }
    52. /**
    53. * 分治法
    54. * @param arr
    55. * @param left
    56. * @param right
    57. * @return
    58. */
    59. public int getMaxSumDivide(int[] arr,int left,int right){
    60. int sum;
    61. //只有一个元素
    62. if (left == right){
    63. return arr[left];
    64. }
    65. int mid = (left+right)/2;
    66. int leftSum = getMaxSumDivide(arr,left,mid);
    67. int rightSum = getMaxSumDivide(arr,mid+1,right);
    68. //左半部分
    69. int s_left = 0;
    70. int lefts = 0;
    71. for (int i = mid; i >= left; i--) {
    72. lefts += arr[i];
    73. if (lefts>s_left)
    74. s_left = lefts;
    75. }
    76. //右半部分
    77. int s_right = 0;
    78. int rights = 0;
    79. for (int i = mid+1; i <= right; i++) {
    80. rights += arr[i];
    81. if (rights>s_right)
    82. s_right = rights;
    83. }
    84. //求三者最大值
    85. sum = s_left + s_right;
    86. if (sum<leftSum)
    87. sum = leftSum;
    88. if (sum<rightSum)
    89. sum = rightSum;
    90. return sum;
    91. }
    92. @Test
    93. public void demo01(){
    94. int maxSum = getMaxSum(arr);
    95. System.out.println(maxSum);
    96. }
    97. @Test
    98. public void demo02(){
    99. int maxSum = getMaxSumDynamic(arr);
    100. System.out.println(maxSum);
    101. }
    102. @Test
    103. public void demo03(){
    104. int maxSum = getMaxSumDivide(arr);
    105. System.out.println(maxSum);
    106. }
    107. }