King_K

导航

【leetcode】Maximum Subarray

  说起这道题,第一反应就是分治算法。正如我在分治算法里写的,分三种情况递归求解,但是由于leetcode给定的参数只有一个数组,这个,貌似不能用递归吧?然后想用非递归的算法实现动态规划,但是貌似也写不出来。搞了大半天,这道题还是没解决。于是我就舍弃了这些所谓的动态规划啊,分治算法啊。用最原始的,自己想的方法去做,下面是我的思路:

  1.这些网站给出的题目一般都是在一次遍历之后就能得到结果的。所以我要只遍历一遍。

  2.最大和子序列,他两边其他的加起来肯定是负的,否则不可能不加进去。对于子序列后面的如果是负,可以不考虑,因为加进去之后肯定小于当前最小值,所以我要考虑的是子序列前面的一些数(如果存在的话)。

  3.对于一个数字,我要做的就是判断,加入这个数字之后:a.现有的和是否为负,如果为负的话,肯定是不考虑 。此时,从0开始重新算合。这里需要两个参数,一个记录全局最大和,一个记录当前和。

  这个方法的关键在于:如果前面的数加起来是负数,就不用考虑这些数。要及时更新为0。

    def maxSubArray(self, A):
        
        max_sum = A[0]    #记录全局最大和
        temp_sum = A[0]  #记录当前和
        for i in range(1,len(A)):  
            temp_sum = max(temp_sum, 0)  #如果前面的值小于0,则完全没必要加这些值,当前和仍为0
            temp_sum += A[i]    #如果之前的数和是负的,则当前最大值就是这个值A[i];否则,当前和要加上这个数字。
            max_sum = max(temp_sum,max_sum)   #全局最大和:把遍历到此处的全局最大值记录下来,这就是为什么最大和子串之后的负值可以不用考虑。
        return max_sum   

posted on 2015-01-22 17:32  King_K  阅读(208)  评论(0编辑  收藏  举报