leetcode 53. Maximum Subarray(分治,递归)
2016-12-30 09:22
369 查看
找到中间位置,所求子串不是在中间位置的左边,就是右边,还有中间位置两边。中间位置左边右边的和最大的子串可以递归地求得,再求中间位置往左挨个加的最大和以及中间位置往右挨个数的最大和,这两个和就是子串跨越中间位置时的最大和;
这三个最大和中的最大值就是所求最大值。
这道题好像在剑指offer见过额
package leetcode53MaximumSubarray;
import java.util.Arrays;
public class Solution {
public int maxSubArray(int[] nums) {
int res=0,i;
int len = nums.length;
int middle = len/2;
if(len == 2)
{
if(nums[0]>=0&&nums[1]>=0)
return nums[0]+nums[1];
return nums[0]>nums[1]?nums[0]:nums[1];
}
if(len == 1)
{
return nums[0];
}
int maxSubLeft,maxSubRight,maxSubMiddle;
//System.out.println(0+middle-1);
maxSubLeft = maxSubArray(Arrays.copyOfRange(nums, 0, middle));
maxSubRight = maxSubArray(Arrays.copyOfRange(nums, middle,len ));
int maxMiddleLeft = Integer.MIN_VALUE;
int temp = 0;
for(i=middle-1;i>=0;i--)
{
temp+=nums[i];
if(temp>maxMiddleLeft)
maxMiddleLeft=temp;
}
int maxMiddleRight = Integer.MIN_VALUE;
temp = 0;
for(i=middle;i<=len-1;i++)
{
temp+=nums[i];
if(temp>maxMiddleRight)
maxMiddleRight=temp;
}
int maxMiddle = maxMiddleLeft + maxMiddleRight;
if(maxMiddle>=maxSubLeft && maxMiddle>=maxSubRight)
res = maxMiddle;
if(maxSubLeft>=maxMiddle && maxSubLeft>=maxSubRight)
res = maxSubLeft;
if(maxSubRight>=maxMiddle && maxSubRight>=maxSubLeft)
res = maxSubRight;
return res;
}
public static void main(String args[])
{
int[] nums = {1,2,-1};
//int[] nums = {-2,1,-3};
int res = new Solution().maxSubArray(nums);
System.out.println(res);
}
}
这三个最大和中的最大值就是所求最大值。
这道题好像在剑指offer见过额
package leetcode53MaximumSubarray;
import java.util.Arrays;
public class Solution {
public int maxSubArray(int[] nums) {
int res=0,i;
int len = nums.length;
int middle = len/2;
if(len == 2)
{
if(nums[0]>=0&&nums[1]>=0)
return nums[0]+nums[1];
return nums[0]>nums[1]?nums[0]:nums[1];
}
if(len == 1)
{
return nums[0];
}
int maxSubLeft,maxSubRight,maxSubMiddle;
//System.out.println(0+middle-1);
maxSubLeft = maxSubArray(Arrays.copyOfRange(nums, 0, middle));
maxSubRight = maxSubArray(Arrays.copyOfRange(nums, middle,len ));
int maxMiddleLeft = Integer.MIN_VALUE;
int temp = 0;
for(i=middle-1;i>=0;i--)
{
temp+=nums[i];
if(temp>maxMiddleLeft)
maxMiddleLeft=temp;
}
int maxMiddleRight = Integer.MIN_VALUE;
temp = 0;
for(i=middle;i<=len-1;i++)
{
temp+=nums[i];
if(temp>maxMiddleRight)
maxMiddleRight=temp;
}
int maxMiddle = maxMiddleLeft + maxMiddleRight;
if(maxMiddle>=maxSubLeft && maxMiddle>=maxSubRight)
res = maxMiddle;
if(maxSubLeft>=maxMiddle && maxSubLeft>=maxSubRight)
res = maxSubLeft;
if(maxSubRight>=maxMiddle && maxSubRight>=maxSubLeft)
res = maxSubRight;
return res;
}
public static void main(String args[])
{
int[] nums = {1,2,-1};
//int[] nums = {-2,1,-3};
int res = new Solution().maxSubArray(nums);
System.out.println(res);
}
}
相关文章推荐
- Leetcode 分治&递归
- leetcode--递归、回溯和分治
- 【LeetCode】109. Convert Sorted List to Binary Search Tree 解法及注释,分治,递归
- LeetCode 93. Restore IP Addresses 递归,分治
- leetcode 101. Symmetric Tree对称树(递归和迭代)
- leetcode 102.Binary Tree Level Order Traversal-数的层次遍历|递归|非递归实现
- 论分治递归的应用
- Java使用分治递归的思想实现快速排序
- 利用分治思想,写一个求解从n个元素里选取m个有多少种组合方案的(非递归)高性能算法
- leetcode 199. Binary Tree Right Side View-树的右视图|递归|非递归|Java|Python
- 不使用循环或递归判断一个数是否为3的幂(leetcode 326)
- 【LeetCode】 Invert Binary Tree(二叉树反转 递归、非递归实现)
- Leetcode Sort List非递归
- LeetCode (226):Invert Binary Tree 递归实现
- 3 递归和分治的思想
- C++ 分治与递归
- 递归与分治
- 递归与分治策略(1)
- LeetCode 90. Subsets II 递归
- 众数问题(递归、分治)