给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
初看有点懵逼,一直想有啥简单的解法,想半天只想到用暴力做orz
时间复杂度 O(n^3) 时间爆炸
class Solution { public int maxSubArray(int[] nums) { int max = -100; int sum = 0; if(nums.length == 1){ return nums[0]; } for(int i = 0;i < nums.length; i++){ for(int j = i ; j < nums.length; j++){ sum = 0; for(int k = i ; k <= j ; k++ ){ sum += nums[k]; if(sum > max){ max = sum; } } } } return max; } }
贪心法 相对于暴力简直快的飞起
贪心准则:遍历整个数组,逐一求和sum.当sum <= 0 时,对后续子序列和不是正收益,直接舍弃,同时用max记录sum的最大值.
class Solution { public int maxSubArray(int[] nums) { int max = -2147483648;//避免干扰设置成最小 int sum = 0; for(int i : nums){ if(sum > 0){ sum += i; }else{ sum = i; } max = max > sum ? max : sum; } return max; } }
学习了大佬们给出的动态规划法 感觉跟贪心法一个思路,只不过是把sum求和结果放在nums上了
class Solution { public int maxSubArray(int[] nums) { int point = nums[0]; for(int i = 1;i < nums.length;i++){ if(point > 0 ){ nums[i] += point; } point = nums[i]; } return Arrays.stream(nums).max().getAsInt(); } }