LeetCode 53. 最大子数组和 超详细题解(贪心+分治+动规)
LeetCode 53. 最大子数组和 超详细题解贪心分治动规️ 标签动态规划、贪心算法、分治法、数组、经典面试题 难度简单| 题目编号53|️ 题型数组 / 动态规划一、题目描述给定一个整数数组nums找出一个和最大的连续子数组子数组最少包含一个元素返回其最大和。子数组定义数组中的连续部分要求元素连续、非空不能断开选取。二、示例演示示例 1输入nums [-2,1,-3,4,-1,2,1,-5,4] 输出6 解释连续子数组 [4,-1,2,1] 的和最大和为6。示例 2输入nums [1] 输出1 解释数组只有一个元素最大和就是它本身。示例 3输入nums [5,4,-1,7,8] 输出23 解释整个数组的和最大和为23。三、数据范围与约束1 nums.length 10⁵-10⁴ nums[i] 10⁴注意数组长度最高达1e5必须使用O(n)或O(nlogn)算法暴力解法会超时。四、解题思路分析1. 暴力解法超时仅供理解枚举所有子数组计算每个子数组的和记录最大值。外层循环枚举子数组起点内层循环枚举子数组终点累加求和时间复杂度O(n²)n1e5时会严重超时无法通过测评2. 贪心算法Kadane算法最优解法贪心核心思想只保留对和有贡献的前缀遍历数组时维护当前子数组的和如果当前累加和为负数舍弃当前前缀从下一个元素重新开始如果当前累加和为正数继续累加保留当前前缀全程记录遍历过程中出现的最大和该算法时间复杂度O(n)空间复杂度O(1)是本题最推荐解法。3. 动态规划解法定义dp[i]为以第i个元素结尾的最大子数组和。状态转移方程dp[i]max(nums[i],dp[i−1]nums[i])dp[i] \max(nums[i], dp[i-1] nums[i])dp[i]max(nums[i],dp[i−1]nums[i])最终答案为dp数组中的最大值。可优化空间不用dp数组只用单个变量保存前值退化为贪心算法。4. 分治法进阶解法将数组拆分为左、右两部分最大子数组有三种情况完全在左半部分完全在右半部分跨越左右两部分递归求解左右区间再计算跨区间最大值取三者最大。时间复杂度O(nlogn)空间复杂度O(logn)适合进阶学习。五、满分代码Python方法一贪心算法Kadane算法推荐严格遵循题目指定格式代码极简高效可直接提交。fromtypingimportListclassSolution:defmaxSubArray(self,nums:List[int])-int:# 初始化当前和、最大和current_sum0max_sumnums[0]fornuminnums:# 贪心如果当前和为负舍弃从当前数重新开始current_summax(num,current_sumnum)# 更新全局最大和max_summax(max_sum,current_sum)returnmax_sum方法二分治法进阶fromtypingimportListclassSolution:defmaxSubArray(self,nums:List[int])-int:defhelper(left,right):# 递归终止只有一个元素ifleftright:returnnums[left]mid(leftright)//2# 递归求左右最大left_maxhelper(left,mid)right_maxhelper(mid1,right)# 求跨区间最大cross_leftnums[mid]temp0# 左半部分从mid往左遍历foriinrange(mid,left-1,-1):tempnums[i]cross_leftmax(cross_left,temp)cross_rightnums[mid1]temp0# 右半部分从mid1往右遍历foriinrange(mid1,right1):tempnums[i]cross_rightmax(cross_right,temp)cross_maxcross_leftcross_right# 返回三者最大值returnmax(left_max,right_max,cross_max)returnhelper(0,len(nums)-1)六、代码详解贪心版1. 变量说明current_sum以当前元素结尾的子数组最大和max_sum全局最大子数组和初始化为数组首元素2. 核心逻辑遍历每个元素判断是单独取当前元素还是拼接前面的子数组每次更新当前和后同步更新全局最大值遍历完成max_sum即为答案3. 执行流程示例1数组[-2,1,-3,4,-1,2,1,-5,4] current_sum变化-2 → 1 → -2 → 4 → 3 → 5 → 6 → 1 → 4 max_sum变化-2 → 1 → 1 → 4 → 4 → 5 → 6 → 6 → 6 最终返回6七、复杂度分析贪心算法时间复杂度O(n)仅遍历数组一次空间复杂度O(1)只用了常数个变量分治法时间复杂度O(nlogn)递归分层logn层每层遍历n个元素空间复杂度O(logn)递归调用栈开销八、常见易错点初始化错误max_sum初始化为0数组全负时答案错误暴力解法超时大数据量下O(n²)无法通过子数组不连续误将子序列当作子数组选取不连续元素空数组处理题目保证子数组最少一个元素无需处理空数组九、题型总结本题是动态规划、贪心算法的入门经典题也是面试高频原题。核心思想舍弃负贡献前缀保留正贡献前缀。同类题目推荐LeetCode 918. 环形子数组的最大和LeetCode 560. 和为K的子数组LeetCode 152. 乘积最大子数组原创题解禁止搬运觉得有用欢迎点赞、收藏遇到问题可在评论区交流~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2451344.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!