观察-LeetCode53-最大子序和

题目

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

解答1

遍历所有组合:所有的一个数组合、所有的两个数组合、所有的三个数组合、。。。、全数组。该方法时间超时。

解答2

class Solution {
    public int maxSubArray(int[] nums) {            
       int max=nums[0];
        
       //判断数组是否全为负数
       int yes=0;
       for(int i=0;i<nums.length;i++){
           if(nums[i]>=0){
               yes=1;
               break;
           }
       }
       
       if(yes==0){
           //若数组全为负数
           for(int i=0;i<nums.length;i++){
             if(nums[i]>max){
               max=nums[i];
             }
           }             
       }else{
           //若数组不全为负数
           int sum=0;
           for(int i=0;i<nums.length;i++){
             sum+=nums[i];
             if(sum<0){
               sum=0;
             }else{
               if(sum>max){
                 max=sum;
               }
             }
           }
       }
              
       return max;
    }
}

思路:观察总结特点

若数组全为负数,结果则为最小的负数。
否则采用以下思路:观察实例可以发现,最大子数组的前几项加起来不可能为负数。所以将数组的每个数加起来,若和为负数,舍弃之前的所有重新从下一个数开始加。


猜你喜欢

转载自blog.csdn.net/qq_36025975/article/details/80784731