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:
题目里还要求用分治算法来求解,简单来说就是1.先算出左半部分的最大子序列 2.再算出右半部分最大子序列 3.算出横跨左右的最大子序列
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 stub
if(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));
}