02 最大自序和
435字约1分钟
2024-08-11
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和
子数组 是数组中的一个连续部分
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
官方解法
方法一:贪心
若当前指针所指元素之前的和小于 0
,则丢弃当前元素之前的数列
class Solution {
public int maxSubArray(int[] nums) {
int curSum = nums[0];
int maxSum = nums[0];
for (int i = 1; i < nums.length; i++) {
curSum = Math.max(nums[i], curSum + nums[i]);
maxSum = Math.max(curSum, maxSum);
}
return maxSum;
}
}
复杂度分析:
时间复杂度:
O(N)
,只遍历一次数组空间复杂度:
O(1)
,只使用了常数空间
方法二:动态规划
若前一个元素大于 0
,则将其加到当前元素上
public static int maxSubArray(int[] nums) {
for (int i = 1; i < nums.length; i++) {
if (nums[i-1] > 0) {
nums[i] += nums[i-1];
}
}
return Arrays.stream(nums).max().getAsInt();
}
复杂度分析:
时间复杂度:
O(2N)
,遍历一次数组,最后获取最大值遍历一次数组空间复杂度:
O(1)
,只使用了常数空间
自解
暴力解法,最后因为数据量太多,达不到时间限制要求失败
public static void main(String[] args) {
int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
System.out.println(maxSubArray(nums));
}
public static int maxSubArray(int[] nums) {
int max = nums[0];
int tempMax = 0;
for (int i = 0; i < nums.length; i++) {
for (int j = i; j < nums.length; j++) {
tempMax = tempMax + nums[j];
if (tempMax > max) {
max = tempMax;
}
System.out.println("tempMax:" + tempMax + ", j:" + j);
}
tempMax = 0;
}
return max;
}