53_Maximum Subarray-最大子数组
问题描述
Given an integer array nums, find the subarray with the largest sum, and return its sum.
给定一个数组nums, 找到一个子数组。使它的和最大,返回子数组
例子
Input: nums = [-2,1,-3,4,-1,2,1,-5,4] Output: 6 Explanation: 子数组 [4,-1,2,1] 有最大的和6.
基本思想
这是一个动态规划的问题。解题思路类比于最大递增序列。如下:
- 构建数组dp,其大小为nums的长度。其中dp[i] 表示 以 nums[i] 为结尾的子数组的最大的和
- 则dp[i]的大小取决于如下两个变量 dp[i-1]+nums[i] , nums[i]
- 如果 dp[i-1]+nums[i] < nums[i], 则 dp[i] = dp[i-1]+nums[i] 表示nums[i]加入以nums[i-1]为结尾拥有最大和的子数组中
- 如果 dp[i-1]+nums[i] >= nums[i], 则dp[i] = nums[i] 表示 以nums[i]结尾的最大和的子数组只有一个元素
时间复杂度 O(n),空间复杂度O(n)
代码
C++
int maxSubArray(vector<int>& nums) { if (nums.size()<=0) return 0; int size = nums.size(); vector<int> dp(size, 0); dp[0] = nums[0]; int maxSum = dp[0]; for(int i=1;i<size;++i) { dp[i] = max(nums[i], nums[i]+dp[i-1]); maxSum = max(dp[i], maxSum); } return maxSum; }
python
def maxSubArray(self, nums: List[int]) -> int: if len(nums)<=0: return 0 dp = [0] * len(nums) dp[0] = nums[0] for i in range(1,len(nums)): dp[i] = max(nums[i], nums[i]+dp[i-1]) return max(dp)
分类:
编程篇 / leetcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程