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

文章目录

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

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

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


前言

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

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

给你两个按 非递减顺序 排列的整数数组 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);
}


总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

The authenticity of host ‘github.com (20.205.243.166)‘ can‘t be established.

1、运行git clone报错&#xff1a; The authenticity of host github.com (20.205.243.166) cant be established. ECDSA key fingerprint is SHA256:p2QAC1TJYererOttrVc98/R1BWERWu3/LiyFdHfQM. Are you sure you want to continue connecting (yes/no/[fingerprint])? 这个…

cmake 构建Qt存在多个子项目的应用

概述&#xff1a;一般在开发UI应用时候我们都会存在多个子项目&#xff0c;比如一个是主UI界面的项目&#xff0c;有些动态库的项目&#xff0c;主UI中用到子项目中的动态库&#xff0c;我们来看看如何利用cmake来构建这样的一个工程&#xff0c;方便我们在跨平台中开发(macos、…

【HarmonyOS】鸿蒙开发之Video组件——第4.2章

Video组件内VideoOptions属性简介 src&#xff1a;设置视频地址。currentProgressRate&#xff1a;设置视频播放倍速&#xff0c;参数说明如下&#xff1a; number|string&#xff1a;只支持 0.75 &#xff0c; 1.0 &#xff0c; 1.25 &#xff0c; 1.75 &#xff0c; 2.0 。P…

智慧物流之道:数据可视化引领全局监控

在智慧物流的背景下&#xff0c;数据可视化催生了物流管理的全新范式。首先&#xff0c;通过数据可视化&#xff0c;物流企业可以实现对整个供应链的全景式监控。下面我就可以可视化从业者的角度&#xff0c;简单聊聊这个话题。 首先&#xff0c;图表和地图的直观展示使决策者能…

Golang使用Swag搭建api文档

1. 简介 Gin是Golang目前最为常用的Web框架之一。 公司项目验收需要API接口设计说明书&#xff08;Golang后端服务基于Gin框架编写&#xff09;&#xff0c;编写任务自然就落到了我们研发人员身上。 项目经理提供了文档模板&#xff0c;让我们参考模板来手动编写&#xff0c;要…

教机械臂搭积木?《多Agent系统引论》第4章 实用推理Agent 小结

4.0 前言 Agent起作用&#xff0c;不仅仅是逻辑推理的一种、一个过程&#xff0c;还有其他过程在起作用。为了建立贴合实际的Agent&#xff0c;我们需要提出一种新的概念的模型。这就是实用推理型Agent。 4.1 推理分两步 这种Agent把推理的过程分为了两步&#xff0c;一步是理…

Nginx重写功能和反向代理

目录 一、重写功能rewrite 1. ngx_http_rewrite_module模块指令 1.1 if 指令 1.2 return 指令 1.3 set 指令 1.4 break 指令 2. rewrite 指令 3. 防盗链 3.1 实现盗链 3.2 实现防盗链 4. 实用网址 二、反向代理 1. 概述 2. 相关概念 3. 反向代理模块 4. 参数配…

鸿蒙开发-UI-图形-绘制自定义图形

鸿蒙开发-UI-组件 鸿蒙开发-UI-组件2 鸿蒙开发-UI-组件3 鸿蒙开发-UI-气泡/菜单 鸿蒙开发-UI-页面路由 鸿蒙开发-UI-组件导航-Navigation 鸿蒙开发-UI-组件导航-Tabs 鸿蒙开发-UI-图形-图片 鸿蒙开发-UI-图形-绘制几何图形 文章目录 前言 一、使用画布组件绘制自定义图形 1.初…

Linux进程间通信(2)

目录 前言&#xff1a; 正文 1.命名管道 1.1创建及使用 1.2命名管道的工作原理 1.3命名管道与匿名管道的区别 2.命名管道特点及应用场景 2.1特点 2.2场景 3.命名管道实操 3.1实现文件拷贝 3.2实现进程控制 总结&#xff1a; 前言&#xff1a; 管道中除了…

解锁财务信任,掌握企业业务合作中的倾听艺术

企业在经营管理过程中&#xff0c;经常会思考如何才能成为一个完美的财务业务融合体&#xff0c;实现业务合作的最大价值。当我们置身于企业战略规划的构建过程中&#xff0c;就会明显的感觉到&#xff0c;获得财务信任有助于指导团队做出重大决策并推动企业未来的行动。市场和…

读人工不智能:计算机如何误解世界笔记04_数据新闻学

1. 计算化和数据化的变革 1.1. 每一个领域都在进行计算化和数据化的变革 1.1.1. 出现了计算社会科学、计算生物学、计算化学或其他数字人文学科 1.1.2. 生活已走向计算化&#xff0c;人们却一点也没有变 1.2. 在如今的计算化和数据化世界中&#xff0c;调查性新闻的实践必须…

图神经网络的背后:HOW POWERFUL ARE GRAPH NEURAL NETWORKS?

PNACONV - 知乎这是一篇非常接地气的paper&#xff0c;也具有很好的应用价值。 1 aggregators文中提到不同的聚合函数实际上反应的信息是不同的&#xff0c;gin中也有提到类似的内容。 风浪&#xff1a;图神经网络的背后&#xff1a;HOW POWERFUL ARE GRAPH NEURAL NETWORK…ht…

自学Python第十五天-常用的HTML解析工具:bs4、xpath、re

自学Python第十五天-常用的HTML解析工具&#xff1a;bs4、xpath、re BS4安装和引入开始使用find_all() 方法获取标签find() 方法获取标签select() 方法获取标签&#xff0c;css 选择器从标签中获取数据 XPathxpath 基础xpath 语法规则lxml 模块xpath() 方法 REmatch() 方法sear…

【黑马程序员】STL之stack与queue常用操作

stack容器 stack基本概念 stack是一种先进后出的数据结构&#xff0c;它只有一个出口 栈中只有顶端元素才可以被外界使用&#xff0c;因此栈不支持遍历操作 stack常用接口 stack代码示例 #include <iostream> #include <stack>using namespace std;void test()…

AI:138-开发一种能够自动化生成艺术品描述的人工智能系统

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

【软件工具】Typora 免费版下载安装Markdown编辑器-Win10快速安装

目录 下载安装激活配置图片路径管理高亮显示自动保存 使用教程 前言 Typora&#xff0c; 是一款好用的编辑器和阅读器。这里为大家找了一个可使用版本&#xff0c;安装过程十分简单&#xff0c;亲测有效&#xff0c;不浪费大家时间&#xff0c;现在将Typora分享给大家免费使用。…

C# OpenVino Yolov8 Pose 姿态识别

目录 效果 模型信息 项目 代码 下载 效果 模型信息 Model Properties ------------------------- date&#xff1a;2023-09-07T17:11:43.091306 description&#xff1a;Ultralytics YOLOv8n-pose model trained on /usr/src/app/ultralytics/datasets/coco-pose.yaml a…

visual stdio 使用ATL简单使用COM组件

先试用visual stdio创建ATL项目 选择第一个创建ATL简单对象 ProgId也需要添加一下&#xff0c;默认创建完之后添加方法 STDMETHODIMP AddNumber(LONG __num, LONG* result);添加定义 STDMETHODIMP_(HRESULT __stdcall) CATLSimpleObject::AddNumber(LONG __num, LONG* r…

智能充电桩案例分析——交流充电桩

随着电动汽车的发展&#xff0c;充电桩也成为当下的一个很热门的工业产品。我们初步接触充电桩&#xff0c;有了点滴的感受。 先简单说说容易一点的交流充电桩。就是通过市电&#xff08;220V,50赫兹&#xff09;给电动汽车提供充电的能源来源。很容易理解&#xff0c;交流…

高数考研 -- 公式总结(更新中)

1. 两个重要极限 (1) lim ⁡ x → 0 sin ⁡ x x 1 \lim _{x \rightarrow 0} \frac{\sin x}{x}1 limx→0​xsinx​1, 推广形式 lim ⁡ f ( x ) → 0 sin ⁡ f ( x ) f ( x ) 1 \lim _{f(x) \rightarrow 0} \frac{\sin f(x)}{f(x)}1 limf(x)→0​f(x)sinf(x)​1. (2) lim ⁡…