leetcode每日题1
0x00
思路,暴力解法就是两个for循环双指针。
优化考虑,凡是n^2的考虑用分治,将分为左边和右边,因此s=max(s左,s右,s跨越左右 )
而s跨越左右则用双指针,从中间往两头扫描,扫描一次就能拿到。最终nlogn。
进一步发现,如果已知s左小于0,那说明s跨肯定小于s右。
那进一步优化,我们可以将左端为1,右端为n-1 因此能先求出s左。后面递归的求s右,最终我们发现这是一个线性扫描的过程,因此变为n。代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> sum(nums.size(),-99999);
sum[0]=nums[0];
int max=nums[0];
for(int i=1;i<nums.size();i++){
if(sum[i-1]>0) sum[i]=sum[i-1]+nums[i];
else sum[i]=nums[i];
if(sum[i]>max) max=sum[i];
}
return max;
}
};