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

文章目录

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

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

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


前言

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

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

给你两个按 非递减顺序 排列的整数数组 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://www.mzph.cn/news/705830.shtml

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

相关文章

数据结构2月21日

双向链表: func函数&#xff1a; #include <stdio.h> #include <stdlib.h> …

【Flink精讲】Flink性能调优:内存调优

内存调优 内存模型 JVM 特定内存 JVM 本身使用的内存&#xff0c;包含 JVM 的 metaspace 和 over-head 1&#xff09; JVM metaspace&#xff1a; JVM 元空间 taskmanager.memory.jvm-metaspace.size&#xff0c;默认 256mb 2&#xff09; JVM over-head 执行开销&#xff1…

【web】云导航项目部署及环境搭建(复杂)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、项目介绍1.1项目环境架构LNMP1.2项目代码说明 二、项目环境搭建2.1 Nginx安装2.2 php安装2.3 nginx配置和php配置2.3.1 修改nginx文件2.3.2 修改vim /etc/p…

LeetCode--134

134. 加油站 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组 …

Camera metadata设计与应用

前言 Android的Camera Metadata是一种数据结构&#xff0c;用于表示图像特征的参数&#xff0c;例如常见的曝光、AE、AWB、flash等参数。在新的Camera API2 / HAL3架构中&#xff0c;这种结构被用来在app-hal之间IPC传输&#xff0c;取代了原先的SetParameter()/GetParameter(…

【蓝桥杯单片机入门记录】动态数码管

目录 一、数码管动态显示概述 二、动态数码管原理图 &#xff08;1&#xff09;原理图 &#xff08;2&#xff09;动态数码管如何与芯片相连 &#xff08;3&#xff09;“此器件” ——>锁存器74HC573 三、动态数码管显示例程 &#xff08;1&#xff09;例程1&#xf…

独立站谷歌SEO外包与自建SEO团队:哪个更适合您的业务?

随着数字营销的崛起&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为企业提升在线可见度、吸引潜在客户的关键手段。面对独立站谷歌SEO外包服务和自建SEO团队两种选择&#xff0c;企业往往会感到困惑。本文将深入探讨这两种方式的优势与局限&#xff0c;帮助您做出明…

CentOS 7.9上编译wireshark 3.6

工作环境是Centos 7.9&#xff0c;原本是通过flathub安装的wireshark&#xff0c;但是在gnome的application installer上升级到wireshark 4.2.3之后就运行不起来了&#xff0c;flatpak run org.wireshark.Wireshark启动提示缺少qt6&#xff0c;查了一下wireshark新版是依赖qt6的…

<HarmonyOS第一课>运行Hello World

本课程是基于HarmonyOS 3.1/4.0版本的新技术和特性所推出的系列化课程&#xff0c;每个课程单元里面都包含视频、Codelab、文章和习题&#xff0c;帮助您快速掌握HarmonyOS的应用开发&#xff1b; 通过本章节的学习&#xff0c;您可以安装DevEco Studio开发工具&#xff0c;运行…

docker-集成测试搭建

dockerd守护进程 Dockerd&#xff08;Docker Daemon&#xff09;是 Docker 引擎的守护进程&#xff0c;是运行在后台的一个持续运行的进程&#xff0c;负责管理 Docker 容器、镜像、网络和存储等核心功能。它是 Docker 容器的守护进程&#xff0c;负责接收 Docker API 请求并管…

java面试:Seata 分布式事务

文章目录 引言I Seata 分布式事务1.1 Seata的整体架构1.2 使用 Seata 进行分布式事务管理的步骤1.3 配置Seata Server1.4 Seata分布式模式1.5 高可用II XA模式III TA模式3.1 TA的写隔离3.2 AT模式的优缺点3.3 实现AT模式IV TCC模式 (Try-Confirm-Cancel)补偿事务4.1 空回滚和拒…

Java应用通过jmx_exporter对外暴露jvm指标

示范代码 public class App {public static void main( String[] args ) throws InterruptedException {while(true){Thread.sleep(10000);System.out.println( "Hello World!" );}} } maven打包,生成test-prometheus-1.0-SNAPSHOT.jar 编写config.yaml lowercas…

RISC-V SoC + AI | 在全志 D1「哪吒」开发板上,跑个 ncnn 神经网络推理框架的 demo

引言 D1 是全志科技首款基于 RISC-V 指令集的 SoC&#xff0c;主核是来自阿里平头哥的 64 位的 玄铁 C906。「哪吒」开发板 是全志在线基于全志科技 D1 芯片定制的 AIoT 开发板&#xff0c;是目前还比较罕见的使用 RISC-V SoC 且可运行 GNU/Linux 操作系统的可量产开发板。 n…

Wireshark TS | Linux 系统对时问题

问题描述 节前业务运维同事提交了一个 case &#xff0c;说是部署在新业务区域的 Linux 服务器和老业务区域的 Linux 服务器无法对时&#xff0c;脚本里使用的是 clockdiff 命令&#xff0c;无法正常返回结果&#xff0c;而在老业务区域两台服务器之间执行命令就正常&#xff…

桥接模式(Bridge Pattern)

桥接模式&#xff08;Bridge Pattern&#xff09; 定义 将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立的变化。 属于结构性模式 理解 合成/聚合复用原则的具体实现&#xff0c;将一个整体的多个实现部分独立出来&#xff0c;每个部分都可以独立的变化&#x…

OSI参考模型和TCP/IP网络参考模型

1、OSI参考模型 1.1 产生背景 为了解决网络之间的兼容性问题,实现网络设备间的相互通讯,国际标准化组织ISO于1984年提出了OSIRM(Open System Interconnection Reference Model,开放系统互连参考模型)。OSI参考模型很快成为计算机网络通信的基础模型。由于种种原因,并没有…

android stadio通过wifi热点 adb连接android

问题&#xff1a;有时后忘记带android usb线了&#xff0c;但需要调试 解决办法&#xff1a; 1、准备开发工具adb&#xff0c;需要到sdk下的platform-tools的目录下&#xff0c;或者把这个目录加到系统path里&#xff0c;我的是D:\android\sdk\platform-tools这个目录&#x…

Mysql整理-Mysql事务

MySQL中的事务是一组顺序执行的数据库操作,要么完全执行,要么完全不执行。事务是数据库管理的一个重要概念,尤其是在确保数据完整性和一致性方面。MySQL中的事务遵循ACID属性,这是事务性数据库系统的四个关键特性: 原子性(Atomicity):事务内的所有操作都是作为一个单一…

linux系统---nginx(2)rewrite重写功能

目录 一、rewrite概述 1、rewrite功能 2、跳转场景 二、标准配置指令 1、rewrite日志记录指令 2、未初始化变量告警日志记录指令 3、rewrite 指令 3.1 正则表达式 三、rewrite模块使用实例 1.基于域名的跳转 一、rewrite概述 1、rewrite功能 访问重写 rewrite 是 …

sql 分割字段,并分行

创建测试表格 CREATE TABLE test (id INT PRIMARY KEY, data VARCHAR(100)); INSERT INTO test VALUES (1, A,B,C); INSERT INTO test VALUES (2, D,E,F,G);查询并分割字段 SELECT id, value AS split_data FROM test CROSS APPLY STRING_SPLIT(data, ,) WHERE LEN(value) …