一日额发过去鳄鱼过热器套娃给他热气乌鸦头发工业缺乏好热球阀次UR额去哈覅u额去回复阿胶
4条回答 默认 最新
关注
让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
问题:给定一个长度为 n 的数组 nums,找到其中的一个子序列,使得该子序列的和最大。 回答:- 暴力解法:枚举所有可能的子序列,计算它们的和,取最大值。时间复杂度为 O(n^3)。代码如下:
def maxSubArray(nums: List[int]) -> int: n = len(nums) ans = float('-inf') for i in range(n): for j in range(i, n): curr_sum = 0 for k in range(i, j+1): curr_sum += nums[k] ans = max(ans, curr_sum) return ans
- 动态规划:定义一个 dp 数组,dp[i] 表示以第 i 个元素结尾的子序列的最大和。转移方程为:dp[i] = max(dp[i-1]+nums[i], nums[i])。时间复杂度为 O(n)。代码如下:
def maxSubArray(nums: List[int]) -> int: n = len(nums) dp = [0] * n dp[0] = nums[0] ans = dp[0] for i in range(1, n): dp[i] = max(dp[i-1]+nums[i], nums[i]) ans = max(ans, dp[i]) return ans
- 分治法:将数组分成左右两部分,分别求左半部分、右半部分、横跨中间的子序列的最大和,三者取最大值即可。时间复杂度为 O(nlogn)。代码如下:
def maxSubArray(nums: List[int]) -> int: n = len(nums) if n == 1: return nums[0] left_max = maxSubArray(nums[:n//2]) right_max = maxSubArray(nums[n//2:]) cross_max = nums[n//2-1] + nums[n//2] left_sum = right_sum = 0 for i in range(n//2-1, -1, -1): left_sum += nums[i] cross_max = max(cross_max, left_sum) for i in range(n//2, n): right_sum += nums[i] cross_max = max(cross_max, right_sum) return max(left_max, right_max, cross_max)
解决 无用评论 打赏 举报
- GISer Liu 2024-05-05 04:28关注解决 无用评论 打赏 举报
- Kwan的解忧杂货铺@新空间 2024-05-06 06:02关注解决 无用评论 打赏 举报
关注
解决 无用评论 打赏 举报