[LeetCode] Maximum Subarray
来源:互联网 发布:pt老虎机控制软件 编辑:程序博客网 时间:2024/05/16 02:05
Maximum Subarray
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
.
click to show more practice.
解题思路:
题意为找出连续的和最大的子数组的和。可以有两种方法来做,动态规划以及分治法。
1、动态规划。求最值问题一般可以考虑动态规划的方法。d[i]表示子数组nums[k, i]的最大值,其中k>=0并且k<i。其递推公式为:
d[i] = nums[i], i==0 或者 d[i-1]<0d[i] = nums[i] + d[i-1], 其他
然后返回d[]数组的最大值即可。这种方法的空间复杂度为O(n),其实可以优化成O(1)的空间复杂度。时间复杂度为O(n)
class Solution {public: int maxSubArray(vector<int>& nums) { int len = nums.size(); if(len<1){ return 0; } int d[len]; d[0]=nums[0]; int maxSum=nums[0]; for(int i=1; i<len; i++){ if(d[i-1]>0){ d[i]=nums[i]+d[i-1]; }else{ d[i]=nums[i]; } maxSum = max(d[i], maxSum); } return maxSum; }};
2、分治法。这种方法非常巧妙。对于一个数组nums[left, right]来说,nums[mid]是其中间元素。最大值子数组的分布无非三种情况:
(1)最大值子数组在mid前面
(2)最大值子数组在mid后边
(3)最大值子数组跨过mid
对于(1)(2),可以直接用递归来求得,对于(3),我们以mid向两边延伸找到最大的和。然后返回三种情况最大的一项即可。
空间复杂度为O(1),时间复杂度为O(n)
class Solution {public: int maxSubArray(vector<int>& nums) { return maxSub(nums, 0, nums.size() - 1); } int maxSub(vector<int>& nums, int left, int right){ if(left>right){ return INT_MIN; } int mid = (left + right) / 2; int lMax = maxSub(nums, left, mid - 1); int rMax = maxSub(nums, mid + 1, right); int sum = 0; int lMaxSub = 0; for(int i=mid - 1; i>=left; i--){ sum += nums[i]; lMaxSub = max(sum, lMaxSub); } int rMaxSub = 0; sum = 0; for(int i=mid + 1; i<=right; i++){ sum += nums[i]; rMaxSub = max(sum, rMaxSub); } return max(max(lMax, rMax), lMaxSub + rMaxSub + nums[mid]); }};
0 0
- 【LeetCode】Maximum Subarray 和 Maximum Product Subarray
- LeetCode: Maximum Subarray
- LeetCode Maximum Subarray
- [Leetcode] Maximum Subarray
- LeetCode: Maximum Subarray
- leetcode 25: Maximum Subarray
- [LeetCode] Maximum Subarray
- [Leetcode] Maximum Subarray
- [LeetCode]Maximum Subarray
- [leetcode]Maximum Subarray
- LeetCode-Maximum Subarray
- [leetcode] Maximum Subarray
- LeetCode 45: Maximum Subarray
- LeetCode - Maximum Subarray
- LeetCode:Maximum Subarray
- LeetCode 53: Maximum Subarray
- 【leetcode】Maximum Subarray
- Leetcode Maximum Subarray
- hibernate使用getHibernateTemplate().update()出错
- Android 数据存储 利用SQLiteDatabase实现简单的学生管理
- 图基本算法 最小生成树 Prim算法(邻接表/邻接矩阵+优先队列STL)
- DCE编译(ns-3),使用bake
- storm Field ui.port must be an Integer within type range
- [LeetCode] Maximum Subarray
- 使用JQueryUI + FreeMarker 实现Div动态DIalog添加和删除
- ubantu 安装arm-linux-gcc交叉编译器找不到命令问题
- C++实现的json解析器
- 我们用电脑做什么
- Java判断十一位字符串是否为纯数字
- 自定义Quartz的Job监听器
- 前端资源目录优化设想
- Android开发之动画效果浅析(一)