入口
53. 最大子数组和https://leetcode.cn/problems/maximum-subarray/
题目描述
给你一个整数数组 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
方法一:贪心
方法思路:若当前指针之前元素和小于当前元素,则丢弃之前元素。
leetCode热评 道题目的思想是: 走完这一生 如果我和你在一起会变得更好,那我们就在一起,否则我就丢下你。 我回顾我最光辉的时刻就是和不同人在一起,变得更好的最长连续时刻
import java.lang.Math;
class Solution {
public int maxSubArray(int[] nums) {
int maxNum = nums[0], curNum = nums[0];
for(int i=1;i<nums.length;i++){
//’ nums[i] ‘就是新人,他的出现能让我俩比旧人更久的相处更好
curNum = Math.max(nums[i],curNum + nums[i]);//不再计算之前元素的和,不就是一种抛弃
maxNum = Math.max(curNum,maxNum); //以后的和都是和新的人计算
}
return maxNum;
}
}
空间复杂度:O(N)
时间复杂度: O(1)
方法二:动态规划
方法思路:若前一个元素大于0,则将其加到当前元素上。这就想阿德勒心理学中的目的论:我不会受过去影响,我选择了现在的我,只有过去是正向的,才会是我的一部分!
import java.util.Arrays;
class Solution {
public int maxSubArray(int[] nums) {
for(int i = 1;i<nums.length;i++){
//阿德勒心理学:目的论(我不会受过去影响,我选择了现在的我)
if(nums[i-1] > 0) nums[i] = nums[i-1]+nums[i];//只有过去是正向的,才会是我的一部分
}
Arrays.sort(nums);
return nums[nums.length-1];
}
}
空间复杂度:O(N)
时间复杂度: O(1)