(Java)LeetCode-53. Maximum Subarray

来源:互联网 发布:阿里云os系统官网 编辑:程序博客网 时间:2024/05/24 05:02

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

More practice:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.


这题就是非常经典的求最大子序列的问题。首先是O(n)的解法。从前向后遍历数组,一旦加上某个点之后和变成负数,那么就需要从这个数之后重新开始累加。保存最大值即可。更详细的讲解可见《数据结构与算法分析 第一章》代码如下:

public int maxSubArray(int[] nums) {int max = Integer.MIN_VALUE;int temp = 0;for(int num : nums){temp += num;if(temp > max){max = temp;}if(temp < 0){temp = 0;}}return max;}

题目里还要求用分治算法来求解,简单来说就是1.先算出左半部分的最大子序列 2.再算出右半部分最大子序列 3.算出横跨左右的最大子序列

其中前两部分可以递归求解,第三部分先算左半部分以最后一个数结尾的最大子序列,再算后半部分以第一个数开头的最大子序列,加起来即可。代码如下:


public int maxSubArray(int[] nums) {return maxSubArray(nums, 0, nums.length-1);    }private int maxSubArray(int[] nums, int left, int right) {// TODO Auto-generated method stubif(left == right){return nums[left];}int maxLeftSubArray = maxSubArray(nums, left, (right+left)/2);int maxRightSubArray = maxSubArray(nums, (right+left)/2+1, right);int maxLeftBoardArray = nums[(right+left)/2], tempLeft = 0;for(int i = (right + left)/2; i >= left; i--){tempLeft += nums[i];if(tempLeft > maxLeftBoardArray){maxLeftBoardArray = tempLeft;}}int maxRightBoardArray = nums[(right+left)/2+1], tempRight = 0;for(int i = (right + left)/2 + 1; i <= right; i++){tempRight += nums[i];if(tempRight > maxRightBoardArray){maxRightBoardArray = tempRight;}}int maxMidArray = maxLeftBoardArray + maxRightBoardArray;if(maxLeftSubArray >= maxRightSubArray){if( maxLeftSubArray > maxMidArray){return maxLeftSubArray;}else{return maxMidArray;}}else{if(maxRightSubArray > maxMidArray){return maxRightSubArray;}else{return maxMidArray;}}}public static void main(String[] args){    Solution sol = new Solution();        System.out.println("start");    int[] arr = {-2,1,-3,4,-1,2,1,-5,4};    System.out.println(sol.maxSubArray(arr));        }


0 0