记录一下小白刷题,今天是2023年4月28日。
今天刚打了一场acm校赛,感觉自己算法还没入门(蓝桥杯也只拿了个省三),因此正式开启自己的刷题之路,这段时间可能会更新的比较慢:1.6级马上来了,6级还是想冲个600+。2.6月份左右还有一个期末考试,绩点一定要稳在学院第一,这样才能继续保持自己的优势,保持一下绩点。3.这个学期的专业课实在太多,三门408,外加一门数学和编译原理,实验做不完,实验报告也写不完。
废话少说,从leetcode的最大子数组和开始。
乍一看,我这个只会暴力的垃圾是真的觉得难,只能靠题解而活。该题采用动态规划的方法。我们可以用 f(i) 代表以第 i 个数结尾的「连续子数组的最大和」,那么很显然我们要求的答案就是:max(f(i))。而f(i)又是怎么来的呢?显然,f(i)要么是由f(i - 1) + nums[i]得到或者直接由num[i]单独成为一段。因此该动态规划的方程为:
f(i)=max{f(i−1)+nums[i],nums[i]}
ac代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = nums[0];
int ans = nums[0]; // 排除只有一个数的这种特殊情况
for(int i = 1;i < nums.size();i++)
{
res = max(res + nums[i],nums[i]); // 动态转移方程
ans = max(ans,res); // 求最大的f(i)
}
return ans;
}
};