LeetCode力扣 面试经典150题 详细题解 (1~5) 持续更新中

目录

1.合并两个有序数组

2.移动元素

 3.删除有序数组中的重复项

 4.删除排序数组中的重复项 II

暂时更新到这里,博主会持续更新的


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;  
}

暂时更新到这里,博主会持续更新的

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

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

相关文章

ChatGPT高效提问—prompt常见用法(续篇七)

ChatGPT高效提问—prompt常见用法&#xff08;续篇七&#xff09; 1.1 零样本、单样本和多样本 ​ ChatGPT拥有令人惊叹的功能和能力&#xff0c;允许用户自由向其提问&#xff0c;无须提供任何具体的示例样本&#xff0c;就可以获得精准的回答。这种特性被称为零样本&#x…

Python编写远程控制工具--被控端的编写

本节将开始着手用Python编写远程控制工具。因篇幅限制&#xff0c;这里主要编写两 个常用的功能&#xff1a;命令执行和文件传输。当然&#xff0c;好的远程控制工具的功能远远不只 这些&#xff0c;读者可以在此基础上增加新的功能。具体步骤如下。 1&#xff09;编写主函数并…

每日一题——LeetCode1417.重新格式化字符串

方法一 个人方法&#xff1a; s里的字符只有小写字母和数字两种情况&#xff0c;我们可以把s里的字母和数字分隔成两个字符串&#xff0c; 比较两个字符串的长度&#xff0c;只有当两个字符串的长度差值的绝对值为1或0才能满足题意。 长度更长的要放在结果字符串的第一位&am…

写一个python基于线程池的多线程

下面是一个示例程序&#xff0c;它使用Python的concurrent.futures模块中的线程池来实现多线程操作&#xff1a; import concurrent.futuresdef worker(arg):print(fWorking on {arg})return arg * 2if __name__ __main__:# 创建线程池with concurrent.futures.ThreadPoolExe…

嵌入式学习之Linux入门篇笔记——18,makefile基本语法(下)

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.wildcard 函数 格式&#xff1a;$&#xff08;wildcard PAT…

SQL如何实现数据表行转列、列转行?

SQL行转列、列转行可以帮助我们更方便地处理数据&#xff0c;生成需要的报表和结果集。本文将介绍在SQL中如何实现数据表地行转列、列转行操作&#xff0c;以及实际应用示例。 这里通过表下面三张表进行举例 SQL创建数据库和数据表 数据表示例数据分别如下&#xff1a; data_…

数据湖的整体思路

湖本质上是一个集中化&#xff0c;中心化的&#xff0c;一体化的存储技术&#xff0c;并且在其之上追求技术架构的统一化&#xff0c;如流批一体&#xff0c;服务分析一体化。 当数据湖成为中心&#xff0c;那么就可以围湖而建“数据服务环”&#xff0c;环上的服务包括了数仓、…

鸿蒙开发(六)布局概述

迄今为止&#xff0c;我还没有正式提到布局的概念。但其实我之前的demo里面&#xff0c;已经默认使用到了一种布局&#xff0c;那就是线性布局&#xff08;Row、Column&#xff09;&#xff0c;这也是DevEco创建项目默认页面里面默认采用的布局。那么本篇&#xff0c;带着大家一…

微服务介绍、使用 Nacos 实现远程调用以及 OpenFeign 的使用

1 微服务的概念 区别于单体项目 单体项目拆分成微服务项目的目标&#xff1a;高内聚、低耦合 拆分思路 纵向拆分&#xff1a;根据功能模块 横向拆分&#xff1a;抽取可复用模块 2 微服务拆分——远程调用 背景&#xff1a;微服务单一职责&#xff0c;每个服务只有自己的功能…

[PYthon] 字典

如题&#xff0c;这篇博客将带大家来学习Python中的字典~ 那么&#xff0c;是我们想象中的那种字典嘛&#xff1f;接下来跟着可莉去一探究竟吧~ 可莉将这篇文章收录在了&#xff1a;《Python》 可莉推荐的优质博主主页&#xff1a;Keve ’ s blog Python 中的字典&#xff08;D…

-转换流-

它是字节流和字符流之间转换的桥梁 转换流本身其实是字符流&#xff1b; 转换流的位置&#xff1a; 分为两个&#xff1a;字符转换输入流&#xff1a;InputStreamReader将InputStream转换为Reader字符转换输出流&#xff1a;OutputStreamWriter将Writer转换为OutputStream 作用…

4.2 Verilog 过程赋值

关键词&#xff1a;阻塞赋值&#xff0c;非阻塞赋值&#xff0c;并行 过程性赋值是在 initial 或 always 语句块里的赋值&#xff0c;赋值对象是寄存器、整数、实数等类型。 这些变量在被赋值后&#xff0c;其值将保持不变&#xff0c;直到重新被赋予新值。 连续性赋值总是处…

C++ 11新特性之可变参数模板

概述 随着C 11标准的发布&#xff0c;C语言获得了许多强大的新特性&#xff0c;其中一项显著提升灵活性和实用性的创新便是可变参数模板。这一特性极大地扩展了模板在处理不定数量类型或值参数时的能力&#xff0c;为开发者提供了更为强大且灵活的泛型编程工具。 工作机制 在C …

LeetCode Python - 6.Z字形变换

文章目录 题目答案运行结果 题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你的输…

Qualcomm 蓝牙耳机 FAQ(41)---------Audio 问题分析之 ACAT Tools安装

大家好&#xff01; 新的一年&#xff0c;在此祝大家&#xff1a;新年快乐&#xff01;工作上步步高升&#xff01;&#xff01;龙年大吉&#xff01;&#xff01;&#xff01; 也欢迎大家登录大大通平台&#xff0c;春节期间正常更新文章&#xff0c;期待你的到来&#xff0…

语义分割任务的准确率计算:基于PyTorch实现

语义分割任务的准确率计算&#xff1a;基于PyTorch实现 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;语义分割任务概述&#x1f333;&#x1f333;准确率的定义与计算方法&#x1f333;&#x1f333;实践应用与优化策略&#x1f333;&…

《Django+React前后端分离项目开发实战:爱计划》 03 理解项目结构

03 Understanding the Project Structure 《Django+React前后端分离项目开发实战:爱计划》 03 理解项目结构 Let’s look the project files created for us, Open the project folder backend in the code editor. 让我们看看为我们创建的项目文件,在代码编辑器中打开项目…

跟我学C++中级篇——函数模板的匹配

一、介绍和说明 在本文会尝试着把函数的重载以及模板自动推导等方法结合起来&#xff0c;一起分析模板函数的匹配的方式和原则。在普通的函数重载和普通的模板函数中&#xff0c;都比较容易理解调用哪一类&#xff0c;但在一些较为少用或者复杂的情况下&#xff0c;可能会发现…

《MySQL 简易速速上手小册》第7章:MySQL监控和日志分析(2024 最新版)

文章目录 7.1 配置和使用 MySQL 监控工具7.1.1 基础知识7.1.2 重点案例&#xff1a;使用 Python 和 Prometheus 监控 MySQL 性能7.1.3 拓展案例 1&#xff1a;自动化 MySQL 慢查询日志分析7.1.4 拓展案例 2&#xff1a;实时警报系统 7.2 解读 MySQL 日志文件7.2.1 基础知识7.2.…

使用django构建一个多级评论功能

&#xff0c;评论系统是交流和反馈的重要工具&#xff0c;尤其是多级评论系统&#xff0c;它允许用户回复特定评论&#xff0c;形成丰富的对话结构。这个文章是使用Django框架从零开始构建一个多级评论系统。Django是一个高级Python Web框架&#xff0c;它鼓励快速开发和干净、…