【LeetCode Hot100 普通数组】最大子数组和、合并区间、旋转数组、除自身以外数组的乘积、缺失的第一个正整数
普通数组
- 1. 最大子数组和(Maximum Subarray)
- 解题思路
- 动态规划的优化解法(Kadane 算法)
- 核心思想
- 代码解析
- 2. 合并区间(Merge Intervals)
- 解题思路
- 代码实现
- 3. 旋转数组(Rotate Array)
- 解题思路
- 代码实现
- 4. 除自身以外数组的乘积(Product of Array Except Self)
- 解题思路
- 代码实现
- 5. 缺失的第一个正整数(First Missing Positive)
- 解题思路
- 代码实现
1. 最大子数组和(Maximum Subarray)
给定一个整数数组 nums
,你需要找到一个具有最大和的连续子数组,并返回其和。
解题思路
这个问题使用 动态规划 或者 贪心算法 来解决。解题的关键在于如何选择包含当前元素的最大和子数组。
动态规划的优化解法(Kadane 算法)
-
动态规划状态定义:
sum
: 当前子数组的和(即以当前元素结尾的最大和子数组的和)。如果当前和sum
是正的,则可以继续累加到后面的元素,否则从当前元素重新开始。ans
: 存储迄今为止遇到的最大子数组和。
-
过程:
- 从左到右遍历数组,依次计算每个位置
i
的最大和子数组。 - 如果当前
sum
是负数,则不继续累加,重新从当前元素开始。 - 每次计算完
sum
后,更新全局最大值ans
。
- 从左到右遍历数组,依次计算每个位置
核心思想
- 当前的子数组和与前一个子数组和的关系:如果前一个子数组和
sum
为正,则将其累加到当前元素中;否则,重新从当前元素开始计算新的子数组。 - 这样可以保证每次计算出的子数组和是局部最大和,从而得到全局最大和。
代码解析
class Solution {public int maxSubArray(int[] nums) {int sum = 0; // 用来表示前缀和int ans = nums[0]; // 初始化答案为数组的第一个元素// 遍历数组for (int i = 0; i < nums.length; i++) {// 如果 sum > 0 就说明 sum 对后续子数组有贡献sum = sum > 0 ? sum + nums[i] : nums[i]; // 继续累加,或者从当前元素重新开始// 更新最大子数组和ans = Math.max(sum, ans); // 比较当前的 sum 和之前的最大和,更新结果}return ans; // 返回最终的最大子数组和}
}
2. 合并区间(Merge Intervals)
给定一个由区间组成的二维数组 intervals
,合并所有重叠的区间,并返回一个不重叠的区间数组。
解题思路
- 排序:首先根据区间的起始端点对数组进行排序。这样,区间之间的关系就可以通过顺序来判断。
- 合并:从排好序的区间开始,逐个判断是否可以合并:
- 如果当前区间与结果集的最后一个区间重叠(即当前区间的起始点小于等于结果集最后一个区间的终点),则合并它们,将合并后的区间的终点更新为两个区间终点的最大值。
- 如果当前区间与结果集最后一个区间不重叠,直接将当前区间加入结果集。
代码实现
class Solution {public int[][] merge(int[][] intervals) {// 先对二维数组的每一项的左端点进行排序Arrays.sort(intervals, (p, q) -> p[0] - q[0]);// 使用List是因为不知道最终的结果里面会有几个元素List<int[]> ans = new ArrayList<>();// 遍历每个区间for (int[] p : intervals) {int m = ans.size();// 判断是否能合并,合并时更新右端点为两个区间的最大值if (m > 0 && ans.get(m-1)[1] >= p[0]) {ans.get(m-1)[1] = Math.max(ans.get(m-1)[1], p[1]);} else {// 不能合并时,直接将当前区间加入结果集ans.add(p);}}// 将 List 转成二维数组返回return ans.toArray(new int[ans.size()][]);}
}
3. 旋转数组(Rotate Array)
给定一个数组,将数组中的元素向右旋转 k
步,要求使用 O(1) 的空间复杂度。
解题思路
-
翻转法:本题的核心思路是通过数组的翻转来解决:
- 首先对整个数组进行一次翻转,这样数组中需要旋转的部分会被反转到数组的前面。
- 然后,将这两个部分分别翻转回去,得到最终的结果。
-
步骤:
- 步骤 1:对整个数组进行一次翻转。
- 步骤 2:对数组的前
k
个元素进行翻转。 - 步骤 3:对数组的剩余部分(从
k
到数组的末尾)进行翻转。
代码实现
class Solution {public void rotate(int[] nums, int k) {/*** 首先对整个数组实行翻转,这样原数组中需要翻转的子数组,就会跑到数组最前面。* 这时候,从 k 处分隔数组,左右两数组,各自进行翻转即可。*/k = k % nums.length; // 处理 k 大于数组长度的情况reverse(nums, 0, nums.length - 1); // 翻转整个数组reverse(nums, 0, k - 1); // 翻转前 k 个元素reverse(nums, k, nums.length - 1); // 翻转剩余的部分}// 辅助翻转函数public void reverse(int[] nums, int start, int end) {while (start < end) {// 交换 nums[start] 和 nums[end]int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start++;end--;}}
}
4. 除自身以外数组的乘积(Product of Array Except Self)
给定一个整数数组 nums
,返回一个数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
以外的所有元素的乘积。
要求 不使用除法,并且在 O(n) 时间复杂度内完成算法。
解题思路
-
两次遍历法:
- 第一次遍历:计算每个元素左侧所有元素的乘积,保存在
ans
数组中。 - 第二次遍历:从右侧遍历数组,同时计算每个元素右侧所有元素的乘积,并与
ans
数组中的值相乘,得到最终结果。
- 第一次遍历:计算每个元素左侧所有元素的乘积,保存在
-
步骤:
- 步骤 1:初始化一个
ans
数组,ans[i]
用来存储从左到i-1
位置的乘积。 - 步骤 2:从左到右遍历数组,更新
ans
数组。 - 步骤 3:初始化一个变量
R
,用于存储当前元素右边所有元素的乘积。然后从右到左遍历数组,将右边的乘积与ans
数组中的值相乘。
- 步骤 1:初始化一个
代码实现
class Solution {public int[] productExceptSelf(int[] nums) {int ans[] = new int[nums.length];// 用 ans 数组来存储左边的积ans[0] = 1;for (int i = 1; i < nums.length; i++) {ans[i] = ans[i - 1] * nums[i - 1]; // 左侧所有元素的乘积}int R = 1;for (int i = nums.length - 1; i >= 0; i--) {ans[i] = ans[i] * R; // 左侧积与右侧积的乘积R = R * nums[i]; // 更新右侧积}return ans;}
}
5. 缺失的第一个正整数(First Missing Positive)
给定一个未排序的整数数组 nums
,请你找出其中缺失的第一个正整数。
要求:
- 你必须实现时间复杂度为 O(n) 的解法。
- 你只能使用常数级别的额外空间。
解题思路
这个问题的关键在于通过对数组进行原地交换排序,使得每个正整数 x
被放置在索引 x-1
上。通过这种方式,我们可以在一次遍历后找到第一个不符合条件的索引,返回该索引加一即为缺失的第一个正整数。
-
原地排序:
- 遍历数组,对每个符合条件的正整数
nums[i]
,将其放置到对应的位置nums[nums[i] - 1]
。只有当nums[i]
在有效范围内且与目标位置的元素不相等时,才进行交换。
- 遍历数组,对每个符合条件的正整数
-
查找缺失的第一个正整数:
- 遍历数组,查找第一个索引
i
,使得nums[i] != i + 1
。这个索引加一即为缺失的第一个正整数。
- 遍历数组,查找第一个索引
-
若数组中没有缺失的正整数:
- 如果数组中的所有位置都符合
nums[i] == i + 1
,说明所有从1
到n
的正整数都存在,则缺失的第一个正整数为n + 1
。
- 如果数组中的所有位置都符合
代码实现
class Solution {public int firstMissingPositive(int[] nums) {int n = nums.length;for (int i = 0; i < n; i++) {// 只处理有效范围内的正整数while (nums[i] >= 1 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {// 交换元素到正确位置nums = swap(nums, i, nums[i] - 1);}}// 查找第一个不符合条件的位置for (int i = 0; i < n; i++) {if (nums[i] != i + 1) {return i + 1; // 返回缺失的第一个正整数}}return n + 1; // 如果数组中没有缺失的正整数,返回 n + 1}// 交换数组中的两个元素public int[] swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;return nums;}
}
相关文章:
【LeetCode Hot100 普通数组】最大子数组和、合并区间、旋转数组、除自身以外数组的乘积、缺失的第一个正整数
普通数组 1. 最大子数组和(Maximum Subarray)解题思路动态规划的优化解法(Kadane 算法)核心思想 代码解析 2. 合并区间(Merge Intervals)解题思路代码实现 3. 旋转数组(Rotate Array)…...

共享存储-一步一步部署ceph分布式文件系统
一、Ceph 简介 Ceph 是一个开源的分布式文件系统。因为它还支持块存储、对象存储,所以很自 然的被用做云计算框架 openstack 或 cloudstack 整个存储后端。当然也可以单独作 为存储,例如部署一套集群作为对象存储、SAN 存储、NAS 存储等。 二、ceph 支…...
19.Python实战:实现对博客文章的点赞系统
Flask博客点赞系统 一个基于Flask的简单博客系统,具有文章展示和点赞功能。系统使用MySQL存储数据,支持文章展示、点赞/取消点赞等功能。 功能特点 文章列表展示文章详情查看(模态框展示)点赞/取消点赞功能(每个IP只…...
【stm32】定时器输出PWM波形(hal库)
一. PWM基本原理 PWM是一种通过调节信号的占空比(Duty Cycle)来控制输出平均电压的技术。占空比是指高电平时间与整个周期时间的比值。例如: - 占空比为50%时,输出平均电压为电源电压的一半。 - 占空比为100%时,输出始…...

当Ollama遇上划词翻译:我的Windows本地AI服务搭建日记
🚀 实现Windows本地大模型翻译服务 - 基于OllamaFlask的划词翻译实践 🛠️ 步骤概要1️⃣ python 环境准备2️⃣ Ollama 安装3️⃣ 一个 Flask 服务4️⃣ Windows 服务化封装5️⃣ 测试本地接口6️⃣ 配置划词翻译自定义翻译源7️⃣ 效果展示8️⃣ debug…...
Linux上Elasticsearch 集群部署指南
Es 集群部署 Es 集群部署 Es 集群部署 准备好三台服务器。示例使用:110.0.5.141/142/143 1、es用户和用户组创建,使用root账号 groupadd esuseradd -g es es2、将es安装包和ik分词器上传到:/home/es/目录下(任意目录都行&#…...

字节Trae使用感想(后端)
前言 昨天分享了字节哥的Trae从0到1创作模式构建一个vue前端项目,今天又来试试她的后端项目能力。不是我舔,不得不说确实不错。可惜现在曾经没有好好学习,进不了字节。既然进不了字节,那我就用字节哥的产品吧。 后面有惊喜…...

国产编辑器EverEdit - 二进制模式下观察Window/Linux/MacOs换行符差异
1 换行符格式 1.1 应用场景 稍微了解计算机历史的人都知道, 计算机3大操作系统: Windows、Linux/Unix、MacOS,这3大系统对文本换行的定义各不相同,且互不相让,导致在文件的兼容性方面存在一些问题,比如它们…...

文心一言4月起全面免费,6月底开源新模型:AI竞争进入新阶段?
名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、文心一言免费化的背后:AI成本与应用的双重驱动1️⃣成本下降,推动文心一言普及2…...

解锁机器学习算法 | 线性回归:机器学习的基石
在机器学习的众多算法中,线性回归宛如一块基石,看似质朴无华,却稳稳支撑起诸多复杂模型的架构。它是我们初涉机器学习领域时便会邂逅的算法之一,其原理与应用广泛渗透于各个领域。无论是预测房价走势、剖析股票市场波动࿰…...
如何使用Three.js制作3D月球与星空效果
目录 1. 基本设置2. 创建星空效果3. 创建月球模型4. 添加中文3D文字5. 光照与相机配置6. 动画与控制7. 响应式布局8. 结语 在本文中,我们将一起学习如何利用Three.js实现一个3D月球与星空的效果,并添加一些有趣的元素,比如中文3D文字和互动功…...
SQL语句语法
SQL数据库的结构为 库database 表table 段segment 行row 列column 或field SQL 语句主要分为以下几类: 数据定义语言(DDL):用于定义数据库对象,如数据库、表、视图、索引等。数据操作语言(DML)&…...
github上文件过大无法推送问题
GitHub 对文件大小有限制,超过 100 MB 的文件无法直接推送到仓库中。 解决思路: 使用 Git Large File Storage (Git LFS) 来管理大文件不上传对应的大文件 使用Git LFS: 1. 安装 Git LFS 首先,你需要安装 Git LFS。可以按照以…...
微信小程序的请求函数封装(ts版本,uniapp开发)
主要封装函数代码: interface HttpOptions {url: string;method?: string;headers?: { [key: string]: string };data?: any; }class Http {private timeout: number;private baseUrl: string;public constructor() { this.timeout 60 * 1000;this.baseUrl ht…...

Visual Studio Code支持WSL,直接修改linux/ubuntu中的文件
步骤1 开始通过 WSL 使用 VS Code | Microsoft Learn 点击远程开发扩展包。 步骤2 Remote Development - Visual Studio Marketplace 点击install, 允许打开Visual Studio Code。 步骤3 共有4项,一齐安装。 步骤4 在WSL Linux(Ubuntu)中…...

openAI最新o1模型 推理能力上表现出色 准确性方面提升 API如何接入?
OpenAI o1模型在回答问题前会进行深入思考,并生成一条内部推理链,使其在尝试解决问题时可以识别并纠正错误,将复杂的步骤分解为更简单的部分,并在当前方法无效时尝试不同的途径。据悉,o1不仅数学水平与美国奥林匹克竞赛…...

GC 基础入门
什么是GC(Garbage Collection)? 内存管理方式通常分为两种: 手动内存管理(Manual Memory Management)自动内存管理(Garbage Collection, GC) 手动内存管理 手动内存管理是指开发…...
Go语言协程Goroutine高级用法(一)
什么协程 在Go语言中,协程就是一种轻量的线程,是并发编程的单元,由Go来管理,所以在GO层面的协程会更加的轻量、高效、开销更小,并且更容易实现并发编程。 轻量级线程 Go语言中协程(线程)与传…...

DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件
1 DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件 1.1 背景 AI能力再强,如果不能在企业的自有业务上产生助益,那基本也是一无是处。将企业的自有业务上传到线上训练,那是脑子进水的做法ÿ…...

【鸿蒙HarmonyOS Next实战开发】lottie动画库
简介 lottie是一个适用于OpenHarmony和HarmonyOS的动画库,它可以解析Adobe After Effects软件通过Bodymovin插件导出的json格式的动画,并在移动设备上进行本地渲染。 下载安裝 ohpm install ohos/lottieOpenHarmony ohpm 环境配置等更多内容,…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...