思路:动态规划
若前一个元素大于0,则将其加到当前元素上。
当i指到-2时是初始值,
当i指向1时,因为前一个元素是-2<0,所以保持当前元素不变,
当i指向-3时,因为前一个元素是1>0,因此将前一个元素加到当前元素上,-3变为-2,
依此类推,最后通过取列表中最大元素得到想要的答案。
代码实现:
遍历数组元素,若前一个元素大于0,则将其加到当前元素上,最后返回修改过的数组中的最大值。
——时间复杂度:O(N),只遍历一次数组
——空间复杂度:O(1),动态规划算法没有占用新的空间,只使用了常数空间
class Solution {
public int maxSubArray(int[] nums) {
int max=nums[0];
for(int i=1;i<nums.length;i++){
if(nums[i-1]>0){
nums[i]+=nums[i-1];
max=Math.max(nums[i],max);
}else{
nums[i]=nums[i];
max=Math.max(nums[i],max);
}
}
return max;
}
}
官方解答:
class Solution {
public int maxSubArray(int[] nums) {
int pre=0,max=nums[0];
for(int x:nums){
pre=Math.max(pre+x,x);
max=Math.max(max,pre);
}
return max;
}
}