题目描述如下:
第一次我做的思路是用两个for循环遍历,写完以后面试官说你这么写是有问题的,会超时。由于面试时间比较紧张,就叫我私底下再好好想想。
最好的做法是用动态规划算法 时间复杂度为0(N)
public int maxSubArray(int[] nums) {
int[]dp = new int[nums.length]; //动态规划列表 dp,
dp[0] = nums[0];
int res = nums[0];//全局最大值
for(int i = 1;i<nums.length;i++){
dp[i] = Math.max(nums[i],nums[i]+dp[i-1]);//dp[i] 代表以元素 nums[i]为结尾的连续子数组最大和
//如果dp[i-1]<0,则不加;如果dp[i-1]>0,则加上该值,进行更新
res = Math.max(res,dp[i]); //更新全局最大值
}
return res;
}
也可以只用一个res变量解决该问题:
public int maxSubArray(int[] nums) {
int res = nums[0];//全局最大值
for(int i = 1;i<nums.length;i++){
nums[i] += Math.max(0,nums[i-1]);
res = Math.max(res,nums[i]);
}
return res;
}