问题
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
一、解决思路
这道题有两种解法:贪心 or 动态规划
(1)贪心
贪心要明白贪的是什么,对于这道题而言,假若连续和是一个负数,那么加上下一个数时,要么就是变大了,要么就是变小了,假若是变大了,那么加上这个数一定是一个正数,不如直接令这个数为当前最大和来得大,这就是要贪的地方,对于代码的实现就是,出现负数时,令这个负数等于0,因为负数只会降低和的大小,因此贪的是遇到负数和及舍弃。
(2)动态规划
动态规划解法需要理解状态转移方程:
当前状态和取决于上一状态,和当前的值,那么只需要取(上一状态+当前值)和(当前值)的较大值作为当前状态值即可,如果当前值大于上一状态+当前值的话,意味着上一状态的值可以被舍弃,因为它是负数。不难写出状态转移方程
df[i] = max(df[i-1]+nums[i], nums[i])
然后遍历时取最大即可。
二、使用步骤
1.贪心
代码如下(示例):
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int count = 0;
int result = INT_MIN;
for (int i=0; i<nums.size(); i++){
count += nums[i];
if (count>result){
result = count;
}
if (count<0){
count = 0;
}
}
return result;
}
};
2.动态规划
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
总结
对于贪心问题需要认清贪的是什么,对于动态规划,需要写出状态的转移方程,理解状态之间的关系就不难写出转态转移方程,那什么时候用动态规划呢?一般就是需要遍历数组或者其它类似数组的数据类型的所有状态时,然后状态之间的转换存在关系时,就可以考虑动态规划了。