1暴力
static int twoSum(int[] nums) {
int max = nums[0];
for (int i = 0; i < nums.length; i++) {
int add = 0;
for (int j = i; j < nums.length; j++) {
add = add + nums[j];
max =Math.max(max, add);
}
}
return max;
}
时间复杂度:O(N^2)。
空间复杂度:O(1)。
2动态规划
每次遍历了所有元素,仅能求得这一个位置。这也导致算法的时间复杂度是O(N²)的。把当前位置的元素作为结尾时的最大和,可以根据前一个位置求得的最大和 sum 的正负,来决定当前位置是加在前一个元素之后,还是自己成为一个新的子数组。
public int maxSubArray(int[] nums) {
int max = nums[0];
int[] inner = new int[nums.length];
inner[0]=nums[0];
for (int i = 1; i < nums.length; i++) {
inner[i]=Math.max(nums[i],inner[i-1]+nums[i]);
max = Math.max(max,inner[i]);
}
return max;
}
3 简化下内存
int sum =0;
int inner =nums[0];
for (int i = 1; i < nums.length; i++) {
inner=Math.max(nums[i],inner+nums[i]);
sum = Math.max(sum,inner);
}
return sum;