以后我要养成写博客的习惯,所以呢,先开始多记录吧。
题目:最大子序和
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 初看题需要注意的点:这个最大和是连续的子数组。附加题:复杂度要求O(n)。 思路一(复杂度为o(n^2),不完美):从第一个数开始,让它依次和后面的数值相加,例如:a,a+b,a+b+c,a+b+c+d……,下一个轮回是:b,b+c,b+c+d……,依次类推,每次加的时候都比较一下最大值,把最大的值保留下来。 具体操作:
1 class Solution { 2 public int maxSubArray(int[] nums) { 3 int sum=0; 4 for(int i=0;isum){ 9 sum=tempsum;10 }11 }12 }13 if(sum==0){14 for(int i=0;i nums[j]){17 int temp=nums[i];18 nums[i]=nums[j];19 nums[j]=temp;20 } 21 }22 }23 int len=nums.length;24 sum=nums[len-1];25 return sum;26 }else{27 return sum;28 } 29 }30 }
优化思路一的算法,达到同样的效果:
1 class Solution { 2 public int maxSubArray(int[] nums) { 3 int sum=nums[0]; 4 for(int i=0;i
思路二(复杂度为O(n)):审题看到“最大和”这几个字,就要想,既然要 求最大,那得把每种可能性都算出来,不全算出来,程序怎么敢断言现在的就是最大的呢?所以呢,肯定要有遍历这种方法,其次,要找两个数,一个数来用存当前的最大值(用sum表示),另一个数用来存之前的最大值(用res表示),然后拿着这两个数进行比较,择其大者而留之(最终结果放在res中)。
1 class Solution { 2 public int maxSubArray(int[] nums) { 3 int res = nums[0]; 4 int sum = 0; 5 for (int num : nums) { 6 if (sum > 0){ 7 sum += num; 8 } 9 else{10 sum = num; 11 } 12 res = Math.max(res, sum);13 }14 return res;15 }16 }