leetcode刷题Day2

53、最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
最简单的思路:
比较暴力,就是把每次的都求出来,然后找最大的子序和。
第一次:

class Solution {
    public int maxSubArray(int[] nums) {
       int sum,max;
       for(int i=0;i<nums.length;i++)
       {  
           sum=0,max=0;
           for(int j=i;j<nums.length;j++)
           {
               sum=sum+nums[j];
           }
           if(sum>max)
           {
               max=sum;
           }
       }
        return max;             
    }
}

这个代码存在的问题很多:1、最后函数return的max,但是在一开始初始化的时候没有赋值,这个必须要赋值的,因为for循环如果不执行的话,那max就没有值。2、if的位置不对,if的作用应该是每次求完sum做比较,所以应该写在for循环里边。
第二次:

class Solution {
    public int maxSubArray(int[] nums) {
       int sum,max;
       for(int i=0;i<nums.length;i++)
       {  
           sum=0,max=0;
           for(int j=i;j<nums.length;j++)
           {
               sum=sum+nums[j];     
               if(sum>max){
                    max=sum;
               }
           }

       }
        return max;             
    }
}

问题1、赋值格式不对,java中可以设的时候int max,sum;但是赋值的时候不能这么写,必须分开写max=0;sum=0;2、赋值位置不对,for循环中的赋值在外边是不可见的,在第一种代码的错误中有说明。这样想for循环若没有执行的话那max=0就没有发生过呀,所以就相当于没有赋值呀。3、还有一个事情需要考虑就是当想要获取最大值的时候,变量初始值需要赋值为最小值,反之最大值。最小的值不能赋为0,0是一个很大的数,最小的数是Integer.MIN_VALUE
4、max在for循环外赋值,里边不能赋值,若赋值的话每次初始化,之前的最大值不就抵消了,而sum就不用在外边,他不需要保存每次的结果。
第三次:

class Solution {
    public int maxSubArray(int[] nums) {
       int sum;
       int max=Integer.MIN_VALUE;
       for(int i=0;i<nums.length;i++)
       {  
           sum=0;
           for(int j=i;j<nums.length;j++)
           {
               sum=sum+nums[j];
               if(sum>max)
               {
                  max=sum;
               }
           }
          
       }
        return max;             
    }
}

分治法待做,回头补上嘻嘻嘻嘻嘻

猜你喜欢

转载自blog.csdn.net/weixin_43443278/article/details/87887007