【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