最大子序和题目的思路探讨与源码
最大子序和的题目如下图,该题属于数组类的题目,主要考察对于动态规划和贪心算法的理解,通过考虑相邻两个位置数字的加和和历史之和的对比,最终得到最大的子序列之和。本人没有想出分治法,使用了两种不同的算法,贪心算法使用的是Python编写,动态规划使用的是Java编写,该题思路较为基础,是简易类的题目。
本人认为该题目可以使用贪心算法,本题中贪心算法的核心就是:1)如果当前的元素的历史之和是小于0的,则丢弃历史之和,将最大和改为当前元素值;2)而如果当前的元素的历史之和是大于等于0的。则加上历史之和。
#喷火龙与水箭龟
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if(len(nums)==0):
return None
if(len(nums)==1):
return nums[0]
FlagCurrentSum=0
MaxFlagSum=-65532
for ij in nums:
if(FlagCurrentSum<0):
FlagCurrentSum=ij
elif(FlagCurrentSum>=0):
FlagCurrentSum=ij+FlagCurrentSum
else:
pass
MaxFlagSum=max(MaxFlagSum,FlagCurrentSum)
return MaxFlagSum
而上述的算法使用的是贪心算法,其实还有一种动态规划方法,而这种动态规划的方法其实就是将上一个值加和到当前值,其具体的思路是:如果前一个元素大于0,那么就把前一个于元素和当前元素加和后进行赋值,赋值给当前的元素,遍历完整个数组后,直接取数组的Max值即可解决。
#喷火龙与水箭龟
class Solution {
public int maxSubArray(int[] nums) {
if(nums.length==1){
return nums[0];
}
int maxNum = Integer.MIN_VALUE;
for(int ij=0;ij0){
nums[ij+1]=nums[ij+1]+nums[ij];
}
}
for(int ij=0;ij