【LeetCode-53】最大子数组和(贪心动归)

LeetCode53.最大子数组和

力扣题目链接: https://leetcode.cn/problems/maximum-subarray/description/

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

示例:

  • 输入: [-2,1,-3,4,-1,2,1,-5,4]
  • 输出: 6
  • 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6
解法1:贪心算法

如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方!
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”

局部最优的情况下,并记录最大的“连续和”,可以推出全局最优

从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。

Java版本解法:

class Solution {public int maxSubArray(int[] nums) {if (nums.length == 1) return nums[0];int count = 0;int sum = Integer.MIN_VALUE;for (int i = 0; i < nums.length; i++) {count+=nums[i]; // 每一次只记录下最大的值,如果前面的数相加一直为正则可以继续往后相加sum = Math.max(sum, count);if (count <= 0) count = 0;}return sum;}
}
解法2:动态规划

这个题我们也可以使用动态规划来做,因为我们遍历数组的时候每一个的dp[i]最大值,都是通过dp[i-1]进行推导而出。我们做动态规划的题的时候,根据我学习的代码随想录里面的方法,分为了五个步骤:

  • 确定dp数组(dp table)以及下标的含义

dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]

  • 确定递推公式

dp[i]只有两个方向可以推出来:

  • dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
  • nums[i],即:从头开始计算当前连续子序列和

一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);

  • dp数组如何初始化

从递推公式可以看出来dp[i]是依赖于dp[i - 1]的状态,dp[0]就是递推公式的基础。

dp[0]应该是多少呢?

根据dp[i]的定义,很明显dp[0]应为nums[0]即dp[0] = nums[0]。

  • 确定遍历顺序

递推公式中dp[i]依赖于dp[i - 1]的状态,需要从前向后遍历

  • 举例推导dp数组

手动的推导一下推导过程

    public int maxSubArray1(int[] nums) {if (nums.length == 1) return nums[0];int[] dp = new int[nums.length];int max = nums[0];dp[0] = nums[0];for (int i = 1; i < nums.length; i++) {dp[i] = Math.max(nums[i], dp[i-1] + nums[i]);max = Math.max(max, dp[i]);}return max;}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/627005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一篇:node的背景及版本的检查

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 前言 Node.js 是一个基于 Chrome V8 JavaScript 引擎…

Linux第23步_安装windows下的STM32CubeProgrammer软件和安装 DFU驱动程序

STM32CubeProgrammer软件是通过USB3.0接口烧写系统软件。 STM32CubeProgrammer需要java运行环境&#xff0c;因此需要安装JAVA软件。 Java 运行环境版本必须是 V1.7 及以上&#xff0c;一定要用 64位的&#xff0c;和win系统一致&#xff0c;否则使用 STM32CubeProgrammer烧…

微信怎么申请小程序商城?一步步教你完成

随着移动互联网的发展&#xff0c;越来越多的企业和个人开始关注微信小程序。微信小程序是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用“触手可及”的梦想&#xff0c;用户扫一扫或者搜一下就能打开应用。其中&#xff0c;小程序商城因其便捷性和实用性&#xf…

吸嘴旋转对位贴合

背景&#xff1a;高精度贴片机需要在上看相机视觉定位芯片&#xff0c;芯片准确的贴合到leadframe里面。 问题&#xff1a;首先相机手眼标定后&#xff0c;已知视觉相机给出的芯片几何中心位置A1(x1,y1)&#xff0c;角度θ1&#xff0c;吸嘴几何中心的位置A2&#xff08;x2&am…

Embedding:数据的奇妙之变

在深度学习的领域&#xff0c;Embedding是连接符号与连续的一座桥梁。它通过将高维离散数据映射到低维连续向量空间&#xff0c;为大模型提供了更好的处理能力。 在这一部分&#xff0c;我们将深入研究Embedding的基本概念、作用以及在深度学习中的广泛应用。 一、向量Embedd…

如何一台电脑操作两个adb 设备

1.首先使用 adb devies 命令 2.然后使用 adb -s 上面的返回的id号 shell 进入对应的开发板

机器学习:自然语言处理介绍

机器学习在自然语言处理&#xff08;NLP&#xff09;领域扮演着关键的角色&#xff0c;它利用算法和统计模型来处理和理解人类语言。以下是一些与机器学习和自然语言处理相关的关键概念和技术&#xff1a; 文本分类&#xff1a; 机器学习可以用于对文本进行分类&#xff0c;例如…

matlab/simulink风电光伏储能虚拟同步机VSG下垂控制虚拟惯量控制,光伏变压减载控制一次调频二次调频研究,储能下垂控制SOC

非无穷大系统&#xff01; 第一个介绍风光储VSG算例研究。 其中风机采用虚拟惯性控制&#xff0c;下垂控制&#xff0c;网侧采用VSG虚拟同步机控制。储能下垂控制。 上述结果为整个系统的仿真波形&#xff0c;包括频率&#xff0c;pmsg永磁风机出力&#xff0c;储能出力&…

Python 使用类实现装饰器

一、基本原理 使用类实现装饰器的基本原理: 定义一个类&#xff0c;__init__ 方法用于初始化装饰器的状态&#xff0c; __call__ 方法用于定义在调用被装饰函数时所执行的逻辑。通过类创建一个可调用对象&#xff08;类的实例&#xff09;&#xff0c;该对象在被调用时执行 _…

批量合并PDF 文件的 5 大解决方案

PDF 可以将一个、两个、三个甚至更多的记录封装在一起&#xff0c;以显示完整的信息和用于逻辑和交互式结构化的不同元素。由于 PDF 可以提出多层结构&#xff0c;因此当用户知道如何最大化这种格式时&#xff0c;将所有文件组织到其中非常有效。正如许多经验丰富的用户和 PDF …

中国飞行模拟器行业研究与投资前景报告(2024版)

内容简介&#xff1a; 国外从事飞行模拟器研究的公司主要有加拿大航空电子设备(CAE)公司和MSI公司&#xff0c;法国的泰雷兹公司&#xff0c;美国的飞安国际公司、罗克韦尔•科林斯公司、L3技术公司和红雀模拟飞行技术公司&#xff0c;德国Simtec六自由度运动模拟系统公司等。…

c# 人脸识别的思路

在C#中实现人脸识别&#xff0c;您可以使用诸如虹软ArcFace等第三方人脸识别SDK。以下是一个基于虹软ArcFace SDK的C#人脸识别示例的大致步骤&#xff1a; 安装与引用SDK&#xff1a; 首先&#xff0c;您需要从虹软官网下载适用于C#的ArcFace人脸识别SDK&#xff0c;并将其安装…

运维大模型评测基准OpsEval发布及解读

在2023年CCF国际AIOps挑战赛暨“大模型时代的AIOps”研讨会上&#xff0c;由清华大学、中国科学院计算机网络信息中心、南开大学、必示科技、中兴通讯、中亦科技、腾讯、华为、联想、国泰君安证券、基石数据、Zabbix中国宏时数据、日志易等多家首批社区成员单位共同发布了国内首…

基于Java SSM框架实现新生入学信息管理系统项目【项目源码+论文说明】

基于java的SSM框架实现新生入学信息管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认…

基于Java SSM框架实现学生寝室管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现学生寝室管理系统演示 摘要 寝室管理设计是高校为学生提供第二课堂&#xff0c;而我们所在学院多采用半手工管理学生寝室的方式&#xff0c;所以有必要开发寝室管理系统来对进行数字化管理。既可减轻学院宿舍长工作压力&#xff0c;比较系统地对宿舍通告…

省略文字,动态行,查看更多显示全部 组件

备注&#xff1a; 使用 TypeScript 和 React的函数式组件语法。此组件的目的是显示文本&#xff0c;如果文本内容超出了指定的行数&#xff0c;它将显示一个“查看更多”的按钮。当用户点击这个按钮时&#xff0c;将展示全部的文本内容。组件使用了自定义的钩子 useBoundingCli…

JWT相关问题及答案(2024)

1、什么是 JWT&#xff0c;它通常用于什么目的&#xff1f; JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在不同实体之间安全地传输信息。它由三个部分组成&#xff1a;头部&#xff08;Header&#xff09;、载…

微信商家转账到零钱如何开通?场景说明

商家转账到零钱是什么&#xff1f; 通过商家转账到零钱这个功能&#xff0c;如果我们系统需要对用户支付费用&#xff0c;比如发放佣金、提成、退款之类的&#xff0c;可以直接转账到用户的微信零钱。 【商家转账到零钱】是【企业付款到零钱】的升级版&#xff0c;2022年5月1…

Java 开源扫雷游戏 JMine 发布新版 3.0 及介绍视频

Java 开源扫雷游戏 JMine 发布新版 3.0 及介绍视频 Java 开源扫雷游戏 JMine 是笔者开发的基于 Swing 的 Java 扫雷游戏&#xff0c;现已发布新版 3.0 及其介绍视频。视频请见&#xff1a; https://www.bilibili.com/video/BV1RK4y1z7Qz/ 老版本 JMine 1.2.5 的介绍视频请见…

js sort方法的使用

JavaScript中的数组sort()方法用于对数组元素进行排序。默认情况下&#xff0c;sort()方法会按照字符串的Unicode编码进行排序。即使数组中的元素是数字&#xff0c;它们也会被转换为字符串进行比较。 sort()方法会修改原始数组&#xff0c;并返回排序后的数组。 sort()方法的…