※ Leetcode - Dynamic Programming - 53.Maximum Subarray(最大连续和)+152.Maximum Product Subarray(最大连续积)
来源:互联网 发布:陈涌海 知乎 编辑:程序博客网 时间:2024/04/28 08:43
1. Problem Description of 53.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.
求一个数组的最大连续和
2. My solution
这类问题需要关注的核心问题是:
局部最优解如何求得,和全局最优解的关系(状态转移方程的确定)
该题的状态转移方程,仅考虑两个值得大小:Local[i-1]+nums[i]和nums[i]
因此:Local[i]=max([i-1]+nums[i],nums[i])
int maxSubArray(vector<int>& nums) { vector<int>local; int len=nums.size(); //range of int:-(1<<31)~(1<<31)-1 if(len==1) return nums[0]; local.push_back(nums[0]); int global=local[0]; for(int i=1; i<len; i++) { local.push_back(max(local[i-1]+nums[i],nums[i])); global=max(global,local[i]); } return global; }
3. Problem Description of 152. Maximum Product Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.
求数组中元素的最大连续积。
4. My solution
题目与最大连续和的区别关键在于我们不能只考虑前一个最大数与当前数的和。
因为负数的存在,很可能一个绝对值较大的负数,和一个负数相乘得到一个很大的证书。
所以除了记录局部最大值,我们还应该记录局部最小值。
因为nums[i]的正负未知,我们直接把前一个局部最大值和局部最小值分别与nums[i]相乘。
得到:
int tmin=minlocal[i-1]*nums[i];
int tmax=maxlocal[i-1]*nums[i];
最后当前的局部最大值和局部最小值,通过比较三个数得到:
Tmin,tmax,nums[i]
然后更新global值就可以啦~
int maxProduct(vector<int>& nums) { int len=nums.size(); if(len==1) return nums[0]; vector<int>minlocal; vector<int>maxlocal; minlocal.push_back(nums[0]); maxlocal.push_back(nums[0]); int global=nums[0]; for(int i=1; i<len; i++) { int tmin=minlocal[i-1]*nums[i]; int tmax=maxlocal[i-1]*nums[i]; minlocal.push_back(min(min(tmin,tmax),nums[i])); maxlocal.push_back(max(max(tmin,tmax),nums[i])); global=max(maxlocal[i],global); } return global; }
- ※ Leetcode - Dynamic Programming - 53.Maximum Subarray(最大连续和)+152.Maximum Product Subarray(最大连续积)
- 【LeetCode】152. Maximum Product Subarray最大连续子数组乘积
- LeetCode 152. Maximum Product Subarray(最大连续乘积)
- LeetCode 152. Maximum Product Subarray--连续子数组最大乘积
- Maximum Subarray 最大子数组和(连续)@LeetCode
- Maximum Subarray 最大连续和
- LeetCode OJ-53.Maximum Subarray(最大连续子数组和)
- 【LeetCode】53.Maximum Subarray最大连续子序列和
- LeetCode 53. Maximum Subarray--连续子数组的最大和
- LeetCode | Maximum Subarray(连续最大子数组)
- Array-----152. Maximum Product Subarray(最大连续子数组乘积)
- Maximum Product Subarray:数组中最大连续区间求积
- Leetcode#53. Maximum Subarray(连续子序列的最大和)
- LeetCode: -Dynamic Programming-Maximum Subarray[53]-子数组最大和
- LeetCode 53. Maximum Subarray(dynamic programming)
- Maximum Subarray 最大连续子数和
- Maximum Subarray-最大连续子数组和
- 【LeetCode】Maximum Subarray (最大连续子序列和)
- 九度OJ 1111 单词替换
- Opencv中对查找表LUT的使用与理解
- laravel 一 搭建环境(mac)Composer下载安装laravel
- OpenWrt in VirtualBox
- alsa 音频路径的问题:
- ※ Leetcode - Dynamic Programming - 53.Maximum Subarray(最大连续和)+152.Maximum Product Subarray(最大连续积)
- 课堂笔记2016.8.3
- 【杭电1231】最大连续子序列
- dom4j 解析xml
- POJ 2485 Highways【最小生成树最大边,Prime算法】
- (38)操作数组单元 (39)遍历数组 (40)数组游标操作
- 博客相关资源下载 (JAVA,C++,UE4,Unity)
- 断舍离---新生活方式指引
- layer的弹出层的简单的例子