力扣152,53题,最大子序列求和and积
本内容为最大子序列的求和和求积。采用DP的思路,
当前值加上小于之前值,则从该节点重新算起。
这个代码只能返回其结果值,但不能返回最后的子序列(待修改)。
class Solution: def maxSubArray(self,arr): #最大子数组和的DP求解 if not arr:return cur_sub,max_sub = arr[0],arr[0] #记录当前集合和最大集合 res = [arr[0]] for i in range(1,len(arr)): #从第二个开始遍历 if arr[i] + cur_sub > arr[i]: #如果说加上下一个数比当前值大,那么最大的会在当前值后面 cur_sub += arr[i] #更新当前值 max_sub = max(cur_sub,max_sub) #比较得到当前和最大的较大值 res.append(arr[i]) #有误,记录其最大的值 else: #否则的话就小于,则从当前值开始算起 res = [] max_sub = max(arr[i],cur_sub,max_sub,cur_sub+arr[i])#从当前的候选值选个最大的 cur_sub = arr[i] #从当前开始算起 res.append(arr[i]) #记录该子数组的节点 return max_sub,res def maxSubArry_1(self,arr): if not arr:return for i in range(1,len(arr)): arr[i] = max(arr[i],arr[i]+arr[i-1]) print(arr[i],end=',') return max(arr) def maxProduct(self,nums): #子数组求积 if not nums: return 0 res, curmax, curmin = nums[0], nums[0], nums[0] #当前最大和最小 for i in range(1, len(nums)): #从第二个开始遍历 curmax = curmax * nums[i] #与当前值计算看乘积,求最大 curmin = curmin * nums[i] #如果是负数,计算最小值 curmax = max(curmax, curmin, nums[i]) #选一个最大的 curmin = min(curmax, curmin, nums[i]) #选一个最小的 res = curmax if curmax > res else res #最终的结果缓存在res里面 return res if __name__ == '__main__': solution = Solution() arr = [-2,1,-3,4,-1,2,1,-7,-5,4] resSub,res = solution.maxSubArray(arr) print('最大子数组为:',res,'其和为:',resSub) res_1 = solution.maxSubArry_1(arr) print(res_1) resProduct = solution.maxProduct(arr) print('最大子数组乘积:',resProduct)