import org.junit.jupiter.api.Test;public class SumMaximumContinuity { int[] arr = {1,2,3,-6,1}; /** * 暴力 * @param arr * @return */ public int getMaxSum(int[] arr){ int n = arr.length; int max_sum = arr[0]; for (int i = 0; i < n; i++) { int cur_sum = 0; for (int j = i; j < n; j++) { cur_sum += arr[j]; if (cur_sum>max_sum){ max_sum = cur_sum; } } } return max_sum; } /** * 动态规划 * @param arr * @return */ public int getMaxSumDynamic(int[] arr){ int n = arr.length; int max_sum = arr[0]; int cur_sum = 0; for (int i = 0; i < n; i++) { cur_sum += arr[i]; if (cur_sum > max_sum){ max_sum = cur_sum; } if (cur_sum < 0){ cur_sum = 0; } } return max_sum; } /** * 分治法 * @param arr * @return */ public int getMaxSumDivide(int[] arr){ int n = arr.length; return getMaxSumDivide(arr,0,n-1); } /** * 分治法 * @param arr * @param left * @param right * @return */ public int getMaxSumDivide(int[] arr,int left,int right){ int sum; //只有一个元素 if (left == right){ return arr[left]; } int mid = (left+right)/2; int leftSum = getMaxSumDivide(arr,left,mid); int rightSum = getMaxSumDivide(arr,mid+1,right); //左半部分 int s_left = 0; int lefts = 0; for (int i = mid; i >= left; i--) { lefts += arr[i]; if (lefts>s_left) s_left = lefts; } //右半部分 int s_right = 0; int rights = 0; for (int i = mid+1; i <= right; i++) { rights += arr[i]; if (rights>s_right) s_right = rights; } //求三者最大值 sum = s_left + s_right; if (sum<leftSum) sum = leftSum; if (sum<rightSum) sum = rightSum; return sum; } @Test public void demo01(){ int maxSum = getMaxSum(arr); System.out.println(maxSum); } @Test public void demo02(){ int maxSum = getMaxSumDynamic(arr); System.out.println(maxSum); } @Test public void demo03(){ int maxSum = getMaxSumDivide(arr); System.out.println(maxSum); }}