分治:
    暴力最大子序列:

    1. public static int maxSubarray(int[] nums) {
    2. if (nums == null || nums.length == 0) {
    3. return 0;
    4. }
    5. int max = Integer.MIN_VALUE;
    6. for (int begin = 0; begin < nums.length; begin++) {
    7. for (int end = begin; end < nums.length; end++) {
    8. //sum是子序列的和
    9. int sum = 0;
    10. for (int i = begin; i <= end; i++) {
    11. sum += nums[i];
    12. }
    13. max = Math.max(max, sum);
    14. }
    15. }
    16. return max;
    17. }

    分治2: 暴力优化2:

    1. public static int maxSubarray2(int[] nums) {
    2. if (nums == null || nums.length == 0) {
    3. return 0;
    4. }
    5. int max = Integer.MIN_VALUE;
    6. for (int begin = 0; begin < nums.length; begin++) {
    7. int sum = 0;
    8. for (int end = begin; end < nums.length; end++) {
    9. //sum是子序列的和
    10. sum += nums[end];
    11. max = Math.max(max, sum);
    12. }
    13. }
    14. return max;
    15. }

    分治:

    1. public static int divideAndConquer(int[] nums) {
    2. if (nums == null || nums.length == 0) {
    3. return 0;
    4. }
    5. return divideAndConquer(nums, 0, nums.length);
    6. }
    7. /**
    8. * 求出begin到end中最大子序列的和
    9. */
    10. public static int divideAndConquer(int[] nums, int begin, int end) {
    11. if (end - begin < 2) {
    12. return nums[begin];
    13. }
    14. int mid = (begin + end) >> 1;
    15. int leftMax = Integer.MIN_VALUE;
    16. int leftSum = 0;
    17. int rightMax = Integer.MIN_VALUE;
    18. int rightSum = 0;
    19. for (int i = mid - 1; i >= begin; i--) {
    20. leftSum += nums[i];
    21. leftMax = Math.max(leftMax, leftSum);
    22. }
    23. for (int i = mid; i < end; i++) {
    24. rightSum += nums[i];
    25. rightMax = Math.max(rightMax, rightSum);
    26. }
    27. int max = leftMax + rightMax;
    28. return Math.max(max, Math.max(divideAndConquer(nums, begin, mid), divideAndConquer(nums, mid, end)));
    29. }