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分钟。 岗位职责:官网…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
