(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:
题目里还要求用分治算法来求解,简单来说就是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 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
- LeetCode 53. Maximum Subarray Java
- (Java)LeetCode-53. Maximum Subarray
- [leetcode]53. Maximum Subarray(Java)
- [Leetcode] Maximum Subarray (Java)
- [LeetCode][Java] Maximum Subarray
- [LeetCode]Maximum Subarray(Java)
- Leetcode 53. Maximum Subarray (Medium) (java)
- leetcode oj java 53. Maximum Subarray
- [LeetCode]53.Maximum Subarray
- LeetCode --- 53. Maximum Subarray
- [Leetcode] 53. Maximum Subarray
- [leetcode] 53.Maximum Subarray
- 【leetcode】53. Maximum Subarray
- [leetcode] 53.Maximum Subarray
- 【leetcode】53. Maximum Subarray
- LeetCode 53. Maximum Subarray
- [LeetCode]53. Maximum Subarray
- 53. Maximum Subarray LeetCode
- 7天入门php-session基础使用及预定义常量
- 【设计模式系列】--抽象工厂
- mxnet window10 cpu 模式的安装
- C++标准库获取时间、简单的文件操作
- ps
- (Java)LeetCode-53. Maximum Subarray
- python 学习笔记(3) 各种数据类型常用的函数
- 线段树求区间最大值
- shell详解二
- Singleton单例模式
- StringBuffer的常用方法
- 栈的链式存储API
- indexOf
- 第六周 项目3-负数把正数赶出队列