编程小练习二——最大序列和

编程小练习:

时间:2018.6.11

LeeCode53

53. 最大子序和


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

示例:

输入:[-2,1,-3,4,-1,2,1,-5,4],

输出: 6

解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

方法一、

由于数组是连续数组,连着遍历数组,首先记录数组的起始值nums[0],判断下一个值nums[1],当该值大于0时,累加上对当前的求和有帮组;当该值小于0时,累加上并不能使当前的求和有所增加;所以当nums[1] > 0时,进行累加;当nums[1]<0时,直接截断,从当前值开始,以此类推。并且一直比较max和当前的求和值sum,保证max一直记录最大的那个值。

C++pythonjava的代码如下:

一、C++

classSolution {

public:

    int maxSubArray(vector<int>&nums) {      

        int len = nums.size();

        if(len == 0)

        {

            return 0;

        }

       

        int sum = nums[0];

        int max = nums[0];

       

        for(int i = 1; i < len; i++)

        {

            if(sum >= 0)

            {

                sum += nums[i];

            }

            else

            {

                sum = nums[i];

            }

           

            max = (max > sum) ? max :sum;  

        }

      return max;

    }

};

二、python3

classSolution:

    def maxSubArray(self, nums):

        """

        :type nums: List[int]

        :rtype: int

        """

        l = len(nums)

        if(l <= 0):

            return 0

       

        max = nums[0]

        sum = nums[0]

       

        for i in range(1,l):

            if sum > 0:

                sum += nums[i]

            else:

                sum = nums[i]

               

            if max < sum:

                max = sum

        return max

           

三、java

classSolution {

    public int maxSubArray(int[] nums) {

        int len = nums.length;

        if(len == 0)

        {

            return 0;

        }

       

        int max = nums[0];

        int sum = nums[0];

        for(int i = 1; i < len; i++)

        {

            if(sum > 0)

            {

                sum += nums[i];

            }

            else

            {

                sum = nums[i];

            }

           

            max = (max > sum) ? max : sum;

        }

       

        return max;  

    }

}

方法二、动态规划法

下一次的求和只有两种可能: dp+nums[i]nums[i], 这样就形成了一种规则,即在两者中取大。这种方法的时间复杂度为O(n),空间复杂度为O(1)C++pythonjava代码如下:

1C++

classSolution {

public:

    int maxSubArray(vector<int>&nums) {

        int l = nums.size();

        if(l <= 0)

        {

            return 0;

        }

       

        int result = nums[0];

        int dp = nums[0];

        for(int i = 1; i < l; i++)

        {

            dp = max(dp+nums[i], nums[i]);

            result = max(result, dp);

        }

       

        return result;   

    }

};

2python3

classSolution:

    def maxSubArray(self, nums):

        """

        :type nums: List[int]

        :rtype: int

        """

        l = len(nums)

        if l <= 0:

            return 0

        maxnum = nums[0]

        dp = nums[0]

        for i in range(1,l):

            dp = max(dp + nums[i], nums[i])

            maxnum = max(maxnum, dp)

           

        return maxnum

 

  3java

  class Solution {

    public int maxSubArray(int[] nums) {

        int l = nums.length;

        if(l <= 0)

        {

            return 0;

        }

       

        int maxum = nums[0];

        int dp = nums[0];

        for(int i = 1; i < l; i++)

        {

            dp = Math.max(dp + nums[i],nums[i]);

            maxum = Math.max(maxum, dp);

        }

        return maxum;

    }

}     

后续分治法。       

       

 

猜你喜欢

转载自blog.csdn.net/xingzengji9253/article/details/80662438