【力扣hot100题】(012)最大子数组和
一开始想的是使用滑动窗口,将所有截至到某个元素之前的和求一遍之后再倒过来减去前面截至至某个元素之前的和,选取最大的,不出所料超时了。
看了一下以前的解法,然后想到了一种新的思路:设置一个最小元素和设置一个最大元素和,最小元素和是每次求前面所有元素和的时候保留最小的那个值,最大元素和是结果,每次判断截止到这个元素之前所有元素和减去最小的元素和。(应该是贪心)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int minpost=min(0,nums[0]);
int result=nums[0];
int sum=nums[0];
for(int i=1;i<nums.size();i++){
sum+=nums[i];
result=max(result,sum-minpost);
minpost=min(sum,minpost);
}
return result;
}
};
之前的解法也很巧妙,不知道是看评论区哪个大佬写出来的,也是每次求一下截至目前所有元素的和,如果遍历到的这个元素比前面所有元素和都大就舍去前面的元素,只取最大的这个,然后每次和result比较。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int t=0;
int maxx=nums[0];
for(int i=0;i<nums.size();i++){
t=max(nums[i],t+nums[i]);
maxx=max(maxx,t);
}
return maxx;
}
};