题目:
思路:
两个for循环,比较每个子串sum的大小。
注意:不要忘记一个数也是子串。
代码:
算是暴力求解吧。
class Solution {
public int maxSubArray(int[] nums) {
int sum = nums[0];
for(int i=0;i<nums.length;i++){
//一个数的子串
if(nums[i]>sum){
sum = nums[i];
}
int temp = 0;
for(int j=i+1;j<nums.length;j++){
temp = temp + nums[j];
if(nums[i]+temp > sum){
sum = nums[i]+temp;
}
}
}
return sum;
}
}
虽然解出来了,但内存消耗太大!
题目可用动态规划求解。
思路:
-
动态规划的是首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans
-
如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字
-
如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字
-
每次比较 sum 和 ans的大小,将最大值置为ans,遍历结束返回结果
-
时间复杂度:O(n)O(n)
代码:
class Solution {
public int maxSubArray(int[] nums) {
int ans = nums[0];
int sum = 0;
for(int i=0;i<nums.length;i++){
if(sum>0){
sum = sum+nums[i];
}
else{
sum = nums[i];
}
ans = Math.max(sum,ans);
}
return ans;
}
}