LeetCode53——Java之最大子序和

以后我要养成写博客的习惯,所以呢,先开始多记录吧。

题目:最大子序和

给定一个整数数组 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 }

 



原文地址:https://www.cnblogs.com/xiayanjiao/p/10246957.html