LeetCode-探索-初级算法-动态规划-3. 最大子序和(个人做题记录,不是习题讲解)
LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/
- 最大子序和
-
语言:java
-
思路:试图用一次for循环做出来(动态规划的方式),然而失败了。
-
参考代码1(1ms):用到的辅助空间小,如果当前得到的数组和 < 0,那么负数+负数肯定更小,直接当前最大和就是本身,如果原本数组和 > 0,则继续加上当前值,继续判断。
https://blog.csdn.net/weixin_41876155/article/details/80036893
class Solution { public int maxSubArray(int[] nums) {// 动态规划法 int sum=nums[0]; int n=nums[0]; for(int i=1;i<nums.length;i++) { if(n>0)n+=nums[i]; else n=nums[i]; if(sum<n)sum=n; } return sum; } }
-
参考代码2(1ms):每次子数组的和都是尽量取最大值,即当前+下一个和单纯下一个,哪个比较大就用哪一个当最大值。
import java.lang.Math; class Solution { public int maxSubArray(int[] nums) { if(nums.length == 0){ return 0; } int max = nums[0]; int[] res = new int[nums.length]; res[0] = nums[0]; for(int i=1; i<nums.length; ++i){ res[i] = Math.max(res[i-1] + nums[i], nums[i]); if(max < res[i]){ max = res[i]; } } return max; } }
-
参考后重写(1ms):
class Solution { public int maxSubArray(int[] nums) { int sum = nums[0];//表示可能是最大和的连续子数组的和 int max = nums[0];//最大和 for(int i = 1; i < nums.length; ++i){ if(sum > 0) sum += nums[i]; else sum = nums[i]; if(max < sum) max = sum; } return max; } }