leetcode_动态规划/递归 53. 最大子数组和

embedded/2025/2/28 1:05:39/

53. 最大子数组和

  • 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

  • 子数组是数组中的一个连续部分

1. 动态规划

  • 思路:
    1. 遍历数组中的每个元素
    2. 对于每个元素,判断当前的子数组是否应该包括这个元素:如果 cur_sum + num 小于 num,那么就从当前元素重新开始计算子数组和
    3. 否则,继续累加当前元素到 current_sum,在每一步更新全局最大和 max_sum
class Solution(object):def maxSubArray(self, nums):""":type nums: List[int]:rtype: int"""cur_sum = nums[0]max_sum = nums[0]for num in nums[1:]:cur_sum = max(num, cur_sum + num)# 更新当前最大和max_sum = max(max_sum, cur_sum)# 更新全局最大和return max_sum
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

2. 分治法

  • 分治法将数组分成两个子数组,分别求出左边和右边的最大子数组和,然后再计算跨越中点的最大子数组和,最后取这三者中的最大值

  • 具体步骤:

    1. 将数组分为两部分,递归求解每一部分的最大子数组和
    2. 计算跨越中点的子数组和(即左边的部分和右边的部分结合)
    3. 返回三个值中的最大值
def maxSubArray(nums):def divide_and_conquer(nums, left, right):if left == right:return nums[left]mid = (left + right) // 2left_sum = divide_and_conquer(nums, left, mid)right_sum = divide_and_conquer(nums, mid + 1, right)# 计算跨越中点的最大子数组和cross_sum = find_cross_sum(nums, left, right, mid)return max(left_sum, right_sum, cross_sum)def find_cross_sum(nums, left, right, mid):left_max = float('-inf')right_max = float('-inf')current_sum = 0for i in range(mid, left - 1, -1):current_sum += nums[i]left_max = max(left_max, current_sum)current_sum = 0for i in range(mid + 1, right + 1):current_sum += nums[i]right_max = max(right_max, current_sum)return left_max + right_maxreturn divide_and_conquer(nums, 0, len(nums) - 1)
  • 时间复杂度: O(logn)

  • 空间复杂度: O(logn)

  • 3. 暴力枚举

  • 思路是遍历所有的连续子数组,计算它们的和,并找出最大和

  • 这个方法虽然直观,但对于大数组来说效率较低

def maxSubArray(nums):max_sum = float('-inf')n = len(nums)for i in range(n):cur_sum = 0for j in range(i, n):cur_sum += nums[j]max_sum = max(max_sum, cur_sum)return max_sum
  • 时间复杂度: O(n^2)
  • 空间复杂度: O(1)

http://www.ppmy.cn/embedded/167677.html

相关文章

java后端开发day21--面向对象进阶(二)--继承进阶

(以下内容全部来自上述课程) 1.继承 1.子类到底能继承父类中的哪些内容? 构造方法(纯不能) 非私有:不能 private:不能 比如:把构造变量看成自己,爹就是爹&#xff0c…

Qt 是一个跨平台的 C++ 应用程序框架

Qt 是一个跨平台的 C++ 应用程序框架,广泛用于开发图形用户界面(GUI)应用程序,也可以用于开发非 GUI 程序,如命令行工具和控制台应用程序。Qt 提供了丰富的类库和工具,支持多种操作系统,包括 Windows、macOS、Linux 等。 主要特点: 跨平台:Qt 支持多种操作系统,开发…

maven模块化管理

将一个大项目拆分成若干个子模块,方便项目管理维护、扩展,也方便模块间的相互引用,资源共享 具体步骤 先创建一个空项目(父项目)即下图的sky-take-out,然后打开项目结构的模块,选中父模块,再点…

【Java项目】基于Spring Boot的交流互动系统

【Java项目】基于Spring Boot的交流互动系统 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:交流互动系统是一个基于Spring Boot框架的在线管理平台,主要功能包括管理员和用户两大模块。管理员模块功能包括首页、…

图数据库Neo4j面试内容整理-索引(Index)

索引(Index) 是数据库中用来提高查询性能的技术,特别是在处理大量数据时,索引能够大大加速查询操作。在 Neo4j 这样的图数据库中,索引也起着非常重要的作用,尤其是在图中查找节点时,使用索引可以避免全图扫描,从而提高查询效率。 1. Neo4j 中的索引概念

header在spring boot中解析

1.情况1:使用 HttpservletRequest.getHeader 如果使用 getHeader 获取 ,如果有多分 就只获取第一个 用getHeaders 可以获取 全部 2.情况2:使用 @RequestHeader 用String 他会把 多分用逗号拼接成字符串 用 集合 它就会全部获取 3.情况3:Cookie request.getCookie 就…

【FL0091】基于SSM和微信小程序的社区二手物品交易小程序

🧑‍💻博主介绍🧑‍💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…

ubuntu-server 安装 navidia 显卡驱动

资料 https://juejin.cn/post/7362562720708280332 过程 ubuntu-drivers devices 选择ubuntu-server安装 rootroot:~# ubuntu-drivers devices udevadm hwdb is deprecated. Use systemd-hwdb instead. udevadm hwdb is deprecated. Use systemd-hwdb instead. udevadm hwd…