LeetCode力扣 面试经典150题 详细题解 (1~5) 持续更新中
目录
1.合并两个有序数组
2.移动元素
3.删除有序数组中的重复项
4.删除排序数组中的重复项 II
5.多数元素
暂时更新到这里,博主会持续更新的
1.合并两个有序数组
题目(难度:简单):
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
解法一 :
思路:先合并两个数组,然后通过冒泡排序进行排序
public void merge(int[] nums1, int m, int[] nums2, int n) { // 获取nums1数组的长度 int length1 = nums1.length; // 从nums1的有效元素末尾开始,将nums2的所有元素复制到nums1的剩余空间 for (int i = m; i < length1; i++) { nums1[i] = nums2[i - m]; } // 从nums1的开头开始,进行冒泡排序,以确保整个nums1数组是有序的 for (int i = 0; i < length1 - 1; i++) { if (nums1[i] > nums1[i + 1]) { // 如果当前元素大于其相邻的元素,则交换它们 int tmp = nums1[i]; nums1[i] = nums1[i + 1]; nums1[i + 1] = tmp; } } }
解法二:
思路:数组nums1和nums2通过比较的方式填充nums1末尾
public void merge(int[] nums1, int m, int[] nums2, int n) { // 初始化指向nums1和nums2末尾的指针 int i = m - 1; // nums1中有效数据的最后一个索引 int j = n - 1; // nums2中有效数据的最后一个索引 // 初始化指向nums1最终位置的指针 int k = nums1.length - 1; // nums1的末尾索引,也是合并后数组的末尾索引 // 当nums2中还有元素未处理时执行循环 while (j >= 0) { // 如果nums1中还有元素,并且当前nums1元素大于nums2元素 if (i >= 0 && nums1[i] > nums2[j]) { // 将nums1当前元素放到最终位置,并将指针向前移动 nums1[k--] = nums1[i--]; } else { // 否则,将nums2当前元素放到nums1的最终位置,并将指针向前移动 nums1[k--] = nums2[j--]; } } // 循环结束后,nums1包含了合并后的有序数组
}
2.移动元素
题目(难度:简单):
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解法一:
public int removeElement(int[] nums, int val) { int length = 0; // 用于记录非目标值元素的数量,也即新数组的长度 for (int i = 0; i < nums.length; i++) { // 如果当前元素不等于目标值val if (nums[i] != val) { // 将该元素移动到数组的前端(覆盖length位置上的元素) nums[length] = nums[i]; // 更新非目标值元素的数量 length++; } // 如果当前元素等于目标值val,则不做任何操作,直接跳过 } // 返回新数组的长度 return length;
}
解法二:
public int removeElement(int[] nums, int val) { // 初始化右指针j为数组末尾的索引 int j = nums.length - 1; // 遍历数组,左指针i从数组开始位置到j之前的位置 for (int i = 0; i < j; i++) { // 如果当前元素等于目标值val if (nums[i] == val) { // 交换当前元素nums[i]与右指针指向的元素nums[j] int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; // 由于已经交换了一个等于val的元素到数组末尾,所以j向左移动一位 j--; // 由于交换后当前位置的元素可能又变成了需要移除的值,所以i也需要向左移动一位 i--; } } // 返回j+1作为新数组的长度,因为j此时指向最后一个有效元素的下一个位置 return j + 1;
}
3.删除有序数组中的重复项
题目(难度:简单):
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums,使nums的前k个元素包含唯一元素,并按照它们最初在nums中出现的顺序排列。nums的其余元素与nums的大小不重要。 - 返回
k。
解法一:
public int removeDuplicates(int[] nums) { // 使用双指针p和q,p指向当前不重复序列的末尾,q用于遍历数组 int p = 0; int q = 1; // 当q指针未到达数组末尾时执行循环 while (q < nums.length) { // 如果当前p和q指向的元素不相等,说明找到了一个新的不重复元素 if (nums[p] != nums[q]) { // 如果q和p之间的元素个数大于1,说明有多个重复元素 // 此时,将q指向的元素复制到p的下一个位置,覆盖掉多余的重复元素 if (q - p > 1) { nums[p + 1] = nums[q]; } // p指针前移一位,指向新的不重复序列的末尾 p++; } // q指针前移一位,继续遍历数组 q++; } // 返回新的数组长度,即p+1(因为p指向的是最后一个不重复元素的下一个位置) return p + 1;
}
4.删除排序数组中的重复项 II
题目(难度:中等):
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
解法一:
public int removeDuplicates(int[] nums) { // 获取数组的长度 int length = nums.length; // 初始化指针p和q // p指向新数组的最后一个已处理元素之后的位置 // q从数组的第三个元素开始遍历(索引为2) int p = 0; int q = 2; // 当q指针还没有遍历完整个数组时,继续执行循环 while (q < length) { // 如果p指针指向的元素与q指针指向的元素不同 // 说明找到了一个新的、不重复的元素 if (nums[p] != nums[q]) { // 将这个新元素复制到p指针之后的位置 // 因为p指针指向的是新数组的最后一个已处理元素之后的位置 // 所以新元素应该放在p+2的位置(因为p+1的位置是留给下一个不重复元素的) nums[p + 2] = nums[q]; // 将p指针前移一位,为下一个不重复元素腾出空间 p++; } // q指针无论如何都前移一位,继续遍历数组 q++; } // 返回新数组的长度 // 由于数组索引是从0开始的,所以新数组的长度是p+2 // 其中p是新数组的最后一个已处理元素的位置,所以p+2是新数组的长度 return p + 2;
}
5.多数元素
题目(难度:简单):
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解法一:
public int majorityElement(int[] nums) { // 初始化候选元素和计数器 int candidate = nums[0]; // 将候选元素初始化为数组的第一个元素 int count = 0; // 计数器 // 遍历数组 for (int num : nums) { // 如果计数器为0,则当前元素为候选元素,并将计数器设为1 if (count == 0) { candidate = num; count = 1; } // 如果当前元素与候选元素相同,则计数器加1 else if (num == candidate) { count++; } // 如果当前元素与候选元素不同,则计数器减1 else { count--; } } // 返回候选元素,即为多数元素 return candidate; }
暂时更新到这里,博主会持续更新的
相关文章:
LeetCode力扣 面试经典150题 详细题解 (1~5) 持续更新中
目录 1.合并两个有序数组 2.移动元素 3.删除有序数组中的重复项 4.删除排序数组中的重复项 II 5.多数元素 暂时更新到这里,博主会持续更新的 1.合并两个有序数组 题目(难度:简单): 给你两个按 非递减顺序 排列的…...
如何解决利用cron定时任务自动更新SSL证书后Nginx重启问题
利用cron定时任务自动更新SSL证书后,用浏览器访问网站,获取到的证书仍然是之前的。原因在于没有对Nginx进行重启。 据说certbot更新完成证书后会自动重启Nginx,但显然经我检测不是这回事儿。 所以我们需要创建一bash脚本,然后定时调用这个脚…...
第一个 Angular 项目 - 静态页面
第一个 Angular 项目 - 静态页面 之前的笔记: [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 这是在学完了上面这三个内容后能够完成的项目,目前因为还没有学到数…...
网络协议与攻击模拟_17HTTPS 协议
HTTPShttpssl/tls 1、加密算法 2、PKI(公钥基础设施) 3、证书 4、部署HTTPS服务器 部署CA证书服务器 5、分析HTTPS流量 分析TLS的交互过程 一、HTTPS协议 在http的通道上增加了安全性,传输过程通过加密和身份认证来确保传输安全性 1、TLS …...
【linux系统体验】-ubuntu简易折腾
ubuntu 一、终端美化二、桌面美化2.1 插件安装2.2 主题和图标2.3 美化配置 三、常用命令 以后看不看不重要,咱就是想记点儿东西。一、终端美化 安装oh my posh,参考链接:Linux 终端美化 1、安装字体 oh my posh美化工具可以使用合适的字体&a…...
Android 判断通知是进度条通知
1.需求: 应用监听安卓系统中的通知,需要区分出带进度条的通知. 当使用NotificationCompat.Builder构建一个通知时,可以通过调用setProgress(max, progress, indeterminate)方法来添加一个进度条。这里的max参数表示最大进度值,progress表示当前进度值&a…...
学习数据结构和算法的第8天
顺序表的实现 顺序表 本质就是数组 概念及结构 顺序表是用一段物理地址连续的储存单元依次储存数据元素的线性结构,一般情况下采用数组储存,在数组上完成数据的增删。 顺序表就是数组,但是在数组的基础上,它还要求数据…...
JCIM | MD揭示PTP1B磷酸酶激活RtcB连接酶的机制
Background 内质网应激反应(UPR) 中的一个重要过程。UPR是由内质网中的三种跨膜传感器(IRE1、PERK和ATF6)控制的细胞应激反应,当内质网中的蛋白质折叠能力受到压力时,UPR通过减少蛋白质合成和增加未折叠或错…...
基于Java (spring-boot)的音乐管理系统
一、项目介绍 播放器的前端: 1.首页:点击歌单中的音乐播放列表中的歌曲进行播放,播放时跳转播放界面,并显示歌手信息,同时会匹配歌词,把相应的歌词显示在歌词面板中。 2.暂停:当歌曲正在播放时…...
在 MacOS M系列处理器上使用 Anaconda 开发 Oralce 的Python程序
在 MacOS M系列处理器上使用 Anaconda 开发 Oralce 的Python程序 因oracle官方驱动暂无 苹果 M 系列处理器版本,所以使用Arm的python解释器报驱动错误: cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "dlop…...
四、OpenAI之文本生成模型
文本生成模型 OpenAI的文本生成模型(也叫做生成预训练的转换器(Generative pre-trained transformers)或大语言模型)已经被训练成可以理解自然语言、代码和图片的模型。模型提供文本的输出作为输入的响应。对这些模型的输入内容也被称作“提示词”。设计提示词的本质是你如何对…...
CSS之flex布局
flex布局 CSS的Flex布局(Flexible Box Layout)是一种用于在页面上布置元素的高效方法,特别适合于响应式设计。Flex布局使得元素能够伸缩以适应可用空间,可以简化很多原本需要复杂CSS和HTML结构才能实现的布局设计。 flex布局包括…...
UnityShader——02三大主流编程语言
三大主流编程语言 Shader Language Shader language的发展方向是设计出在便携性方面可以与C/JAVA相比的高级语言,“赋予程序员灵活而方便的编程方式”,并“利用图形硬件的并行性,提高算法的效率” Shader language目前主要有 3 种语言&…...
Centos7安装nginx yum报错
Centos7安装nginx yum报错,yum源报错解决办法: 1、更新epel源后,出现yum报错 [roothacker117 ~]# yum install epel-release(安装成功) [roothacker117 ~]# yum install nginx(安装失败,提示如…...
【机组】基于FPGA的32位算术逻辑运算单元的设计(EP2C5扩充选配类)
🌈个人主页:Sarapines Programmer🔥 系列专栏:《机组 | 模块单元实验》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 一、实验目的 二、实验要求 …...
Asp .Net Core 系列:Asp .Net Core 集成 NLog
简介 NLog是一个基于.NET平台编写的日志记录类库,它可以在应用程序中添加跟踪调试代码,以便在开发、测试和生产环境中对程序进行监控和故障排除。NLog具有简单、灵活和易于配置的特点,支持在任何一种.NET语言中输出带有上下文的调试诊断信息…...
一个基于 .NET 7 + Vue.js 的前后端分离的通用后台管理系统框架 - DncZeus
前言 今天给大家推荐一个基于.NET 7 Vue.js(iview-admin) 的前后端分离的通用后台权限(页面访问、操作按钮控制)管理系统框架:DncZeus。 官方项目简介 DncZeus是一个基于 .NET 7 Vue.js 的前后端分离的通用后台管理系统框架。后端使用.NET 7 Entity Framework…...
更换商品图片日期JSON格式报错 - 序列化与反序列化日期格式设置
报错信息 msg: “服务端异常,请联系管理员JSON parse error: Cannot deserialize value of type java.util.Date from String “2023-11-13 13:13:35”: not a valid representation (error: Failed to parse Date value ‘2023-11-13 13:13:35’: Cannot parse da…...
FastJson、Jackson使用AOP切面进行日志打印异常
FastJson、Jackson使用AOP切面进行日志打印异常 一、概述 1、问题详情 使用FastJson、Jackson进行日志打印时分别包如下错误: 源码: //fastjon log.info("\nRequest Info :{} \n", JSON.toJSONString(requestInfo)); //jackson …...
嵌入式大厂面试题(2)—— 富士康
从本篇开始将会更新历年来各个公司的面试题与面经,题目来自于网上各个平台以及博主自己遇到的,如果大家有所帮助,帮忙点点赞和关注吧! 岗位:嵌入式软件工程师。 面试时间:30分钟。 岗位职责:官网…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
