题目描述如下:
第一次我做的思路是用两个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;
}
博客讨论了如何使用动态规划算法在O(N)的时间复杂度内找到整数数组中连续子数组的最大和。提供了两种解决方案,一种是使用额外的dp数组,另一种仅用一个res变量。这两种方法都有效地避免了双重循环导致的时间效率低下。
382

被折叠的 条评论
为什么被折叠?



