剑指42 连续子数组的最大和

解法一 动态规划

  1. class Solution {
  2. public int maxSubArray(int[] nums) {
  3. if (nums == null || nums.length == 0)
  4. return 0;
  5. int pre = 0;
  6. int ans = nums[0];
  7. for (int num : nums) {
  8. pre = Math.max(pre + num, num);
  9. ans = Math.max(pre, ans);
  10. }
  11. return ans;
  12. }
  13. }

解法二 分治法

  1. class Solution {
  2. public int maxSubArray(int[] nums) {
  3. if (nums == null || nums.length == 0)
  4. return 0;
  5. return maxSubSum(nums, 0, nums.length - 1);
  6. }
  7. private int maxSubSum(int[] nums, int left, int right) {
  8. int ans = 0;
  9. if (left == right)
  10. return nums[left];
  11. int mid = (left + right) / 2;
  12. int maxLeftSum = maxSubSum(nums, left, mid);
  13. int maxRightSum = maxSubSum(nums, mid + 1, right);
  14. int maxLeftBorderSum = nums[mid];
  15. int leftBorderSum = 0;
  16. int maxRightBorderSum = nums[mid];
  17. int rightBorderSum = 0;
  18. for (int i = mid; i >= left; i--) {
  19. leftBorderSum += nums[i];
  20. maxLeftBorderSum = Math.max(leftBorderSum, maxLeftBorderSum);
  21. }
  22. for (int j = mid; j <= right; j++) {
  23. rightBorderSum += nums[j];
  24. maxRightBorderSum = Math.max(rightBorderSum, maxRightBorderSum);
  25. }
  26. int maxMidSum = maxLeftBorderSum + maxRightBorderSum - nums[mid];
  27. ans = getMaxOfThree(maxLeftSum, maxMidSum, maxRightSum);
  28. return ans;
  29. }
  30. private int getMaxOfThree(int a, int b, int c) {
  31. int ans;
  32. if (a > b)
  33. ans = a;
  34. else
  35. ans = b;
  36. if (ans < c)
  37. return c;
  38. return ans;
  39. }
  40. }