LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字

本文主要是介绍LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

88合并两个有序数组

1、题目要求

2、解题思路

(1)、暴力解法:

(2)、双指针,使用第三数组的解法:

3、代码展示

(1)、暴力解法:

(2)、双指针,使用第三数组的解法:

283移动零

1、题目要求

2、解题思路

双指针法:

3、代码展示

448找到所有数组中消失的数字

1、题目要求

2、解题思路

(1)、使用HashSet集合的方法:

(2)、标记数组下标的方法:

3、代码展示

(1)、使用HashSet集合的方法:

(2)、记录数组下标的方法:

都看到这了,点个赞再走呗,谢谢谢谢谢!!!


88合并两个有序数组

1、题目要求

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

2、解题思路

(1)、暴力解法:

        因为nums1有m+n个元素,m - 1下标后,都是0,我们直接遍历一遍nums2,把nums2的元素全部依次放到nums1中,再对nums1进行整体排序。

(2)、双指针,使用第三数组的解法:

        我们定义一个新的数组,大小为(m + n),遍历一遍这个数组,定义一个nums1和nums2的下标nums1或nums2谁先遍历完,就要把没遍历完的数组剩下全部元素都放进新的数组中如果两个数组都没遍历完,判断nums1和nums2的下标元素谁小,小的放进新的数组中,同时要更新下标小的那一数组下标

3、代码展示

(1)、暴力解法:

时间复杂度:O(N*logN)使用了快速排序

空间复杂度:O(1)

 public void merge(int[] nums1, int m, int[] nums2, int n) {//暴力求法for(int i = 0; i < n; i++) {nums1[m + i] = nums2[i];}Arrays.sort(nums1);}

(2)、双指针,使用第三数组的解法:

时间复杂度:O(N)

空间复杂度:O(1)

public void merge(int[] nums1, int m, int[] nums2, int n) {//定义一个新的数组,这个数组就是我们排完序的数组,把这个数组的元素赋值给数组nums1int[] newNum = new int[m + n];//遍历nums1和nums2数组,比较这两个数组,谁小先放进新的数组中int nums1Index = 0;int nums2Index = 0;for(int index = 0; index < m + n; index++) {if(nums1Index >= m) {//nums1遍历完了,把剩下的nums2全部依次放进newNum中newNum[index] = nums2[nums2Index++];} else if(nums2Index >= n) {//nums2遍历完了,把剩下的nums1全部依次放进newNum中newNum[index] = nums1[nums1Index++];} else if(nums1[nums1Index] < nums2[nums2Index]){//nums1和nums2都没遍历完,要进行比较,谁小把谁先放进newNum中newNum[index] = nums1[nums1Index++];}else{newNum[index] = nums2[nums2Index++];}}//把newNum数组元素全部放进nums1中for(int i = 0; i < n + m; i++) {nums1[i] = newNum[i];}}


283移动零

1、题目要求

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

2、解题思路

双指针法:

时间复杂度:O(N)

空间复杂度:O(1)

        定义i和j下标,i遍历这个数组,同时遍历jj遍历这数组的非零元素,当i遍历完后,j也统计了数组中所有非零元素的个数那么剩下的就都是0元素了,把剩下的0补齐。

3、代码展示

public static void moveZeroes(int[] nums) {//双指针法,复杂度O(N)//先遍历非零元素,非零遍历完后,剩下的都是0int j = 0;for(int i = 0; i < nums.length; i++) {if(nums[i] != 0) {nums[j++] = nums[i];}}//非零遍历完了,剩下的都是0for(int i = j; i < nums.length; i++) {nums[i] = 0;}}


448找到所有数组中消失的数字

1、题目要求

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

示例 1:

输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]

示例 2:

输入:nums = [1,1]
输出:[2]

2、解题思路

(1)、使用HashSet集合的方法:

时间复杂度:O(N)

空间复杂度:O(N)

         定义一个HashSet遍历一遍数组,把数组的元素都放进set里然后再遍历一遍从1~n(nums.length)的数字,判断set里面有没有这范围的值,没有的话就是缺失的数字,因为题目中的方法要求我们返回链表,所以我们定义一个链表,有缺失的数字就添加到链表中,然后再返回这个链表

(2)、标记数组下标的方法:

时间复杂度:O(N)

空间复杂度:O(1)

        我们的目标是找到缺失数字的下标,知道了缺失数字的下标也能知道缺失的数字,题目之间的关系:数字 = 数字的下标 + 1,如何找到缺失数字的下标呢?

        公式:不是缺失数字的下标 =(数字 - 1)% nums.length,上图,我们可以用这个公式,找到不是缺失数字的下标,然后记录下来他们,上面取了负号的都不是缺失数字的下标,所以这个数组中,4下标和5下标是缺失的数字所以缺失的数字就是5(4+1)和6(5+1)其中我们标记可以取负号,但是这数组中有多个相同的数字,那么多次取负也不一定是负数,我们也可以使用另一种标记的方法:不是缺失的数字就+nums.length第一次遍历完后,所有不是缺失数字都>nums.length,我们再用i遍历一次这个数组的时候,只要是<=nums.length的数字,就是缺失的数字缺失的数字就是i+1把他们添加到list链表上,最后再返回这个链表

3、代码展示

(1)、使用HashSet集合的方法:

 public List<Integer> findDisappearedNumbers(int[] nums) {//set方法List<Integer> list = new LinkedList<>();HashSet<Integer> set = new HashSet<>();//定义一个hashset,把nums的所有元素都放进set里for(int i = 0; i < nums.length; i++) {set.add(nums[i]);}for(int i = 1; i <= nums.length; i++) {if(set.add(i)) {list.add(i);}}return list;}

 

(2)、记录数组下标的方法:

public List<Integer> findDisappearedNumbers(int[] nums) {List<Integer> list = new LinkedList<>();int n = nums.length;for(int x : nums) {//找到x的下标,并记录x下标的值,(x下标值+n)int index = (x - 1) % n;nums[index] += n;}//再次遍历nums,nums元素中,<=n的值就是缺失的数字for(int i = 0; i < n; i++) {if(nums[i] <= n) {list.add(i + 1);}}return list;}


都看到这了,点个赞再走呗,谢谢谢谢谢!!!

这篇关于LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/305228

相关文章

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于