以后我要养成写博客的习惯,所以呢,先开始多记录吧。
题目:最大子序和
给定一个整数数组 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;i<nums.length;i++){ 5 int tempsum=0; 6 for(int j=i;j<nums.length;j++){ 7 tempsum+=nums[j]; 8 if(tempsum>sum){ 9 sum=tempsum; 10 } 11 } 12 } 13 if(sum==0){ 14 for(int i=0;i<nums.length;i++){ 15 for(int j=i+1;j<nums.length;j++){ 16 if(nums[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<nums.length;i++){ 5 int tempsum=0; 6 for(int j=i;j<nums.length;j++){ 7 tempsum+=nums[j]; 8 sum=Math.max(tempsum,sum); 9 } 10 } 11 return sum; 12 } 13 }
思路二(复杂度为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 }