ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

最大子数组问题系列

2021-12-15 10:02:15  阅读:71  来源: 互联网

标签:系列 最大 nums res list 数组 max dp size


"""
最大子数组问题:首先,子数组存在连续的特性。同时,在求取最值问题方面,可以考虑动态规划解法。
下面列举最大子数组问题。
"""

"""
问题1. 输入一个整数数组nums, 找出和最大的子数组,返回这个子数组的和
解题思路:
利用动态规划的解法,定义dp数组为:dp[i]为以num[i]为结尾的最大数组和
转移方程为:dp[i] = max(num[i], dp[i-1] + num[i])表示是否与前面的相邻子数组连接
dp case: dp[0] = num[0]
"""

def max_sub_array_sum(list_nums):
list_size = len(list_nums)
if list_size < 1: return 0
if list_size == 1: return list_nums[0]
dp = [0 for _ in range(list_size)]
dp[0] = list_nums[0] #base case
for i in range(1,list_size):
dp[i] = max(list_nums[i], dp[i-1]+list_nums[i]) #状态转移矩阵
res = -float('inf')
for i in range(list_size):
res = max(res, dp[i])
return res

#由于dp[i] 只与dp[i-1]有关,所有可以进行状态压缩
def max_sub_array_sum_v1(list_nums):
list_size = len(list_nums)
if list_size < 1: return 0
if list_size == 1: return list_nums[0]
dp_0 = list_nums[0]
dp_1 = 0
res = -float('inf')
for i in range(1,list_size):
dp_1 = max(list_nums[i], dp_0 + list_nums[i])#状态转移矩阵
dp_0 = dp_1
res = max(res, dp_1)
return res


"""
问题2. 输入一个整数数组nums, 找出和最大的子数组,返回这个子数组
解题思路:基于上面的方法,添加一个保存结果的数组
"""
def max_sub_array(list_nums):
list_size = len(list_nums)
if list_size < 1: return None
if list_size == 1: return list_nums
dp = [0 for _ in range(list_size)]
dp[0] = list_nums[0]
array_res = [None for _ in range(list_size)] #保存最大和的子数组序列
array_res[0] = list_nums[0:1]
res = -float('inf')
for i in range(1, list_size):
dp[i] = max(list_nums[i], dp[i - 1] + list_nums[i])#状态转移矩阵
if dp[i] == dp[i - 1] + list_nums[i]:
array_res[i] = array_res[i-1] + list_nums[i: i+1]
else:
array_res[i] = list_nums[i:i + 1]
res = max(res, dp[i])

for i in range(list_size):
if dp[i] == res:
return array_res[i]

"""
注意:这道题不能使用先排序,后判断的方法,因为排序使其原先的顺序错乱
"""
if __name__ == "__main__":
list_nums = [-3, 1, 3 , -1, 2, -4, 2]
res = max_sub_array_sum(list_nums)
print(res)

res = max_sub_array_sum_v1(list_nums)
print(res)

res = max_sub_array(list_nums)
print(res)

标签:系列,最大,nums,res,list,数组,max,dp,size
来源: https://www.cnblogs.com/tomorrow-hope/p/15691249.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有