顺序表的列题(力扣)和旋转数组

文章目录

  • 一.删除有序数组中的重复项(取自力扣)

  • 二.合并两个有序数组(取自力扣)

  • 三.旋转数组(多解法)


前言

见面我们说到了顺序表今天来分享几个有关于顺序表的题目

一.删除有序数组中的重复项(取自力扣)

给你两个按 非递减顺序 排列的整数数组 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 中的元素。

遇到这种题目的话,我们首先就是画图,代码题目,首先都是画图,在图上来写代码,因为画图,他可以直观的来表述一些做法光用脑子想是一个不可取的选择,删除重复的数字,我们之前其实是有过做类似于找单身狗的题目,我们用的是异或的方法,但是他现在是在一个有序的数组里,也就是顺序表中,那么我们该如何去解决这个问题呢?

这个题目就有一点,我们之前去完善顺序表的思想,在指定位置,删除某个数字的时候,我们运用了那个双指针的想法,其实做这个题目也是一样的,也是需要用指针多个指针来做。我们首先来创造3个指针,dst,i,j我们就是要删除重复的数

那我该如何去实现了,这里我们思路是这样的,dst它用来保留数字,就是说有重复的数字删去其他的啊,他就作为保留的那个数字,然后i与j他们两个如果相等的话,就让这去加加往前移动,一旦他们两个不相等了,再把i赋给dst,然后再让i去等于j以此类推

翻译下来就是这样的

1.nums[i]==nums[j];j++;
2.nums[i]!=nums[j];dst++;i=j;j++;

然后就可以写题了,注意:当j走到最后一个数的时候,他会越界,所以说还会剩下一个数,因此我们在while循环走完之后,我们还要单独把最后一个数再放进数组才算正确

int removeDuplicates(int* nums, int numsSize) 
{if (numsSize == 0)return 0;int i = 0;int j = 1;int dst = 0;while (j < numsSize){if (nums[i] == nums[j]){j++;}else{nums[dst] = nums[i];dst++;i = j;j++;}}//注意就在这里体现nums[dst] = nums[i];dst++;return dst;}

二.合并两个有序数组(取自力扣)

给你两个按 非递减顺序 排列的整数数组 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 中的元素。

这个题目我个人做的时候感觉还是非常难的,没有做出来,当然自己的水平也本来不是很高,我们做题的时候都要放低自己的心态,学习是没有尽头的

这个地方我们要先理解一个的归并的思想,就是说给我两个数,我该如何让他们按顺序排下来呢?谁的小,谁加加让后把小的那个放下来

但是这个题目,用这种从前往后的比小的不成立,所以马上转变思路,从后往前比大

这波我们选择创建三个指针,因为根据题目来看的话,我要全部放在第一个数组里,所以我设三个指针两个指针都是M和N去决定的另外一个指针放在第一个数组的最后一个,然后两两比较,如果大了的话就往后放,然后减减跟上面的思想是一样的,只不过是一个往前一个往后。

注意:这个地方有个特殊情况,就是说我们上面讨论的是nums2先结束,如果nums1先结束的话,则num2的剩余要移到num1上去

然后就可以作答了

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{int end1 = m - 1, end2 = n - 1;int end = m + n - 1;while (end1 >= 0 && end2 >= 0){if (nums1[end1] > nums2[end2]){nums1[end] = nums1[end1];end--;end1--;}else{nums1[end] = nums2[end2];end--;end2--;}}while (end2 >= 0)//特殊情况{nums1[end] = nums2[end2];end--;end2--;}}

三.旋转数组(多解法)

示例:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

3.1暴力求解,遍历法(时间O(N*K),空间O(1))

这个方法就是一般能想到的方法,用两个for循环去暴力的求解,第一个或循环很简单,第二个或循环有一个细节,我们可以设置一个变量为他就代表下一个位置要放的值。

void rotate(int* nums, int numsSize, int k)
{for (int i = 0; i<k; i++)//大循环,旋转最后一个数
{int replace = nums[numsSize - 1];for (int j = 0; j<numsSize; j++)//小循环,把最后一个数放在第一个,然后都往后面挪{int temp = nums[j];nums[j] = replace;replace = temp;}
}
}

3.2开辟数组法,以空间换时间(时间O(N),空间O(N))

这种解法也是我做出题时所使用的解法,这个解法唯一的坏处就是空间换时间,有些题目他不一定允许你空间复杂度为大N,我个人感觉这个方法比较无脑,比之前的暴力求解还要容易想。他就是开辟了一个新的数组,把k位置前的元素拿出来和位置后的元素拿出来,再放到新的数组里就可以了。

void rotate(int* nums, int numsSize, int k)
{k =k% numsSize;//k可能会存在大于数组元素个数的情况int *tmp = (int *)malloc(sizeof(int)*numsSize);int initial = 0;//原后半for (int i=numsSize-k; i < numsSize; i++){arr[initial] = nums[i];//先将后面的拷入tmp中initial++;}//原前半for (int j = 0; j< numsSize - k; j++){arr[initial] = nums[j];//再将前面的拷入tmp中initial++;}for (int l = 0; l < numsSize; l++){nums[l] = tmp[l];//拷贝回原数组}
}

3.3逆置大法(时间O(N),空间O(1))最优解

这个方法太强了,但是思维量太大,很难想出来。

//先写出一个逆置函数
void reverse(int *nums, int left, int right)
{while (left<right){int temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}
}
void rotate(int* nums, int numsSize, int k)
{if(k>numsSize);{k %= numsSize;//K=numsSize}//前n-k逆置,注意是下标reverse(nums, 0, numsSize -k- 1);//后个k逆置reverse(nums, numsSize -k, numsSize - 1);//整体逆置rverse(nums, 0, numsSize - 1);
}


总结

 顺序表到此就告一段落了,其实顺序表还是有很多缺陷的,所以我们才会开启后面的学习人生也是这样子的,只有不断地完善自己才能取得成功。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

求购EV代码签名证书,看看性价比最优选项要多少钱?

在当今的数字化时代&#xff0c;EV代码签名证书作为一种强化软件安全防线的顶级数字证书&#xff0c;承担着验证软件源码真伪和完整性的重要任务。对于软件开发者和公司来说&#xff0c;购置EV代码签名证书无疑是必不可少的&#xff0c;而其年度费用也成为各方密切关注的核心议…

大概了解一下G1收集器

在上一篇文章中&#xff08;链接&#xff1a;大概了解一下CMS收集器&#xff09;我们提到&#xff0c;CMS是一种主要针对旧生代对象进行回收的收集器。与CMS不同&#xff0c;G1号称“全功能的垃圾收集器”&#xff0c;对初生代内存和旧生代内存均进行管理。鉴于此&#xff0c;这…

CrossOver24破解版下载安装与激活

在 Mac 上运行Windows 软件&#xff0c;CrossOver Mac 可以轻松地从 Dock 本地启动 Windows 应用程序&#xff0c;并将 Mac 操作系统功能&#xff08;如跨平台复制和粘贴以及共享文件系统&#xff09;集成到您的 Windows 程序中。 CrossOver 产品特性 无需重启 CrossOver 可以…

分布式存储系统BeeGFS的部署

1、集群架构 操作系统IP地址1*Ubuntu22.04192.168.1.742Ubuntu22.04192.168.1.603Ubuntu22.04192.168.1.674Ubuntu20.03192.168.1.136 上述四台电脑&#xff0c;我在1中下载了管理服务、元数据服务、存储服务、客户端服务&#xff0c;在2、3中下载了存储服务、客户端服务&…

峟思应变计:工程测量的精密之选

在工程领域中&#xff0c;对于材料应变情况的测量是至关重要的&#xff0c;而应变计则是这一任务中的关键设备。作为专业的工程仪器仪表品牌&#xff0c;峟思始终致力于研发和生产高精度、高可靠性的应变计产品&#xff0c;为铁路、建筑、桥梁、地铁等多个领域提供全面而高效的…

用html编写的小广告板

用html编写的小广告板 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

WEB服务器-Tomcat(黑马学习笔记)

简介 服务器概述 服务器硬件 ● 指的也是计算机&#xff0c;只不过服务器要比我们日常使用的计算机大很多。 服务器&#xff0c;也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求&#xff0c;并进行处理&#xff0c;因此一般来说服务器应具备承担服务并且保障…

北航复试知识点总结

2024.2.25 住行 报道+机试+两天面试=4天 面试流程 (每个人大概20min,早一点到考场!) 形式:5位老师(一记录,四提问) 老师 陆峰 办公地址:北京航空航天大学新主楼H1033 电子邮箱: lufeng@buaa.edu.cn 个人主页:http://shi.buaa.edu.cn/lufeng/ 面试礼仪 于无形中…

springboot+vue前后端分离适配cas认证的跨域问题

0. cas服务搭建参考:CAS 5.3服务器搭建_cas-overlay-CSDN博客 1. 参照springsecurity适配cas的方式, 一直失败, 无奈关闭springssecurity认证 2. 后端服务适配cas: 参考前后端分离项目(springbootvue)接入单点登录cas_前后端分离做cas单点登录-CSDN博客 1) 引入maven依赖 …

高效备考2025年AMC8数学竞赛:2000-2024年AMC8真题练一练

我们今天来随机看五道AMC8的真题和解析&#xff0c;对于想了解或者加AMC8美国数学竞赛的孩子来说&#xff0c;吃透AMC8历年真题是备考最科学、最有效的方法之一。 为帮助孩子们更高效地备考&#xff0c;我整理了2000-2004年的全部AMC8真题&#xff0c;并且独家制作了多种在线练…

【粉丝福利社】一书读懂物联网:基础知识+运行机制+工程实现(文末送书-完结)

&#x1f3c6; 作者简介&#xff0c;愚公搬代码 &#x1f3c6;《头衔》&#xff1a;华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xf…

【Python笔记-设计模式】迭代器模式

一、说明 迭代器模式是一种行为设计模式&#xff0c;让你能在不暴露集合底层表现形式&#xff08;列表、栈和树等&#xff09;的情况下遍历集合中所有的元素。 (一) 解决问题 遍历聚合对象中的元素&#xff0c;而不需要暴露该对象的内部表示 (二) 使用场景 需要对聚合对象…

解决浏览器访问百度,验证成功后提示仍然存在安全风险

如图所示&#xff0c;访问百度页面后&#xff0c;提示安全验证&#xff0c;验证通过后&#xff0c;仍然提示的存在安全风险&#xff0c;请再次验证&#xff0c;如此往复循环&#xff0c;无法登陆百度。 解决方案&#xff1a;关闭User-Agent Switcher for Chrome插件即可恢复正常…

(黑客技术)2024最新版零基础入门自学网络安全

一、自学网络安全学习的误区和陷阱 1.不要试图先以编程为基础的学习再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且实际向安全过渡后可用到的关键知识并不…

std::mutex

std::mutex 和其变体是 C 中用于线程同步的重要工具。让我们详细了解一下这四种互斥量的作用和使用案例&#xff1a; std::mutex&#xff1a; std::mutex 是一种独占式互斥量&#xff0c;用于保护共享数据&#xff0c;确保在同一时间只有一个线程可以访问它。它不支持递归锁定…

WeTrade一分钟带你了解二元期权和其他交易的不同

很多交易者有点分不清楚二元期权和外汇交易有什么不同&#xff0c;其实很简单&#xff0c;今天WeTrade众汇带你了解。 首先&#xff0c;外汇交易。 这是一个市场&#xff0c;就像在股票市场上一样&#xff0c;同样的供需关系&#xff0c;都有固定的交易时间。在外汇交易中&am…

亚信安慧AntDB开启超融合数据库新纪元

&#xff08;一&#xff09; 前言 据统计&#xff0c;在信息化时代的今天&#xff0c;人们一天所接触到的信息量&#xff0c;是古人一辈子所能接收到的信息量的总和。当今社会中除了信息量“多”以外&#xff0c;人们对信息处理的“效率”和“速度”的要求也越来越高。譬如&…

亚信安慧AntDB:数据处理的好帮手

亚信安慧AntDB分布式数据库凭借平滑扩展、高可用性和低成本三大核心优势&#xff0c;在业界获得了极高的评价和认可。这些优点不仅为AntDB提供了巨大的市场发展潜力&#xff0c;也使其成为众多企业在数据管理上的首选解决方案。 AntDB的平滑扩展特性极大地提升了企业的灵活性和…

泰国见!盘古信息诚邀您参加泰国电子智能制造系列展

2024Intelligent Asia Thailand 首届泰国电子智能制造系列展来啦&#xff01; 广东盘古信息科技股份有限公司 诚邀您来参加&#xff01; 届时&#xff0c;盘古信息将会携自主研发的PCB行业数字化解决方案——IMS-MOM制造运营管理系统出席&#xff0c;诚挚邀请您莅临盘古信息…

node版本控制的利器:nvm

使用nvm 下载&#xff1a;https://github.com/coreybutler/nvm-windows/releases 安装指定版本node 命令nvm install 版本号 &#xff0c;例如&#xff1a;nvm install 10.23.0 可以同时安装多个版本&#xff1a; 确定使用的node版本 nvm use 版本号 搞定&#xff0c…