第一次写博客,部分代码借鉴了大牛的思想,如有侵权,请及时联系我,谢谢。
53: 最大子序和
动态规划
1、三重循环
2、利用前面计算过的值,二层循环
3、利用分治思想:最大和序列,可能出现在前半部分,或者后半部分,或者前半部分的某部分(包含最后一个元素)与后半部分的某部分(包含第一个元素 )的拼接
4、动态规划思想
当前元素之前的最佳方案 + 当前元素 = 最佳方案
class Solution(object): def maxSubArray(self,nums): #result = nums[:] for i in range(1,len(nums)): nums[i] = max(nums[i-1] + nums[i],nums[i]) return max(nums)
class Solution: def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int """ # 动态规划算法 max_sub_sum=nums[0] for i in range(1,len(nums)): max_sub_sum = max(nums[i-1]+nums[i],nums[i]) nums[i]=max_sub_sum return max(nums)
5、利用规律
转载:https://www.cnblogs.com/liuyicai/p/10182262.html
下面是一个时间复杂度更小(O(N))的算法:
该算法更为简便之处是忽略了对子序列的寻找比较,而是根据规律直接找出最佳答案.
对于含有正数的序列而言,最大子序列肯定是正数,所以头尾肯定都是正数.我们可以从第一个正数开始算起,每往后加一个数便更新一次和的最大值;当当前和成为负数时,则表明此前序列无法为后面提供最大子序列和,因此必须重新确定序列首项.
class Solution {
public int maxSubArray(int[] nums)
{ int res = nums[0];
int sum = 0;
for (int num : nums)
{ if (sum > 0) sum += num;
else sum = num;
res = Math.max(res, sum);
}
return res; }
}