题目描述
- 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
解法一:暴力解(对于长序列时间超出)
- 两次循环,使用 i 和 j 分别做子序列的左界和右界,对每个子序列内的数据求和,比较得到最大子序列的和。
public int maxSubArray(int[] nums) {
int max=Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
for(int j=i;j<nums.length;j++){
int sum=0;
sum=add(nums,i,j);
max=Math.max(sum,max);
}
}
return max;
}
public int add(int[] nums,int i,int j){
int sum=0;
for(int m=i;m<=j;m++){
sum+=nums[m];
}
return sum;
}
- 时间复杂度…不分析了 都O(n^3)了,我还是太菜了
解法二:动态规划
- dp = Math.max(nums[i],nums[i]+dp);
public int maxSubArray(int[] nums) {
int max = Integer.MIN_VALUE;
int dp = 0;
for(int i=0;i<nums.length;i++){
dp = Math.max(nums[i],nums[i]+dp);
max = Math.max(dp,max);
}
return max;
}
时间复杂度:O(n)
空间复杂度:O(1)
- 分治法的时间复杂度比较高,尽管适用这个题目,这里就不做探讨了