【 顺序表经典算法—移除元素和合并两个有序数组】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

经典算法OJ题1: 移除元素

解法一、逐个判断

解法二、双指针覆盖

经典算法OJ题2: 合并两个有序数组

OJ题分为两个类型:

总结


前言

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

经典算法OJ题1: 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

首先要想清楚移除的本质并不是真删除,而是把元素覆盖即可,覆盖n个元素后,数组总长度就要-n

解法一、逐个判断

把数组从头开始遍历,找到目标元素val,就执行一次任意位置删除

注意: 在实际写代码时,每删除一次元素,i 都要回退一次,因为有的测试用例是 3 3 3 3,val = 3,如果不回退,直接覆盖,会少删两个元素。

代码演示:

void Erase(int* nums, int pos, int len)
{assert(len > 0);while (pos < len){nums[pos] = nums[pos + 1];//数组中后面的数据把前面的数据覆盖pos++;//向后移动}
}
int removeElement(int* nums, int numsSize, int val)
{assert(nums);  //nums不能为空指针int i = 0;int len = numsSize;//数组的有效元素个数for (i = 0; i < len; i++){if (nums[i] == val){Erase(nums, i, len);i--;//这里i--是因为后面的值把i所在的位置覆盖,//如果不--,出了这个循环,i++, 就会把再i上赋的值给忽略,少判断一次len--;}}return len;//返回的是删除之后的数组长度
}

解法二、双指针覆盖

这是一种比较巧妙的解法,用到了双指针 ,对数组内元素进行覆盖,具体实现为:存在两个指针src 、dst ,两者初始都指向数组起始位置,遍历 整个数组,对指针 src 和指针 dst 所指向的值进行比较,如果 *src != val ,就把 *src 赋给 *dst ,然后 dst 向后移动,当然无论相等还是不相等,src 都需要往后移动,这个解法的目的就是把数组中所有非目标值的元素往前移动,最后返回 dst 的下标(dst的下标就是数组中不等于 val 的值的个数)

代码演示:

int removeElement(int* nums, int numsSize, int val) {int src = 0;int dst = 0;while (src < numsSize){if (nums[src] == val){src++;}else{nums[dst] = nums[src];dst++;src++;}}return dst;
}

经典算法OJ题2: 合并两个有序数组

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

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

nums1
数组123000
下标012345
nums2
数组256
下标012

假设比小的思路:设L1为nums1数组的起始位置,L2为nums2数组的起始位置,我们从比小的角度看,L1为1时,L2为2,L2大;L1++,此时L1为2,L2为2,我们假设还是L1的2大;L1++,此时L1为3,L2为2,我们把L2的值赋给L1,那么原来L1位置上的3就没了,所以这种比小的思路是不行的。

假设比大的思路:设L1为nums1数组实际有效数据的最后一个元素(下标为2),L3为nums1数组初始化的最后一个位置(下标为5);L2为nums2数组的最后一个元素;L2为6时,L1为3,L2赋值给L3,L2--,L3--,L2不变;L2为5时,L1为3,L2赋值给L3,L2--,L3--,L1不变;L2为2时,L1为3,此时L1赋值给L3,L3--,L1--;L2为2,L1为2,假设L2的2比L1的2要大,L2赋值给L3,L3--,L2--;此时L2已经完成循环,所以比大的思路时正确的。

此外,我们仍需要考虑两种情况:L2先出循环和L1先出循环

上面的比大思路就是我们的L2先出循环,没有是什么好考虑的。

我们来看L1先出循环的情况:

nums1
数组456000
下标012345
nums2
数组123
下标012

仍然是比大的思路:L2为3时,L1为6,L1的值赋给L3,L1--,L3--,L2不变;L2为3时,L1为5,L1的值赋给L3,L3--,L1--,L2不变;L1为4时,L2为3,L1的值赋给L3,L3--,L1--,L2不变;此时L1先完成循环,但是L2的数据还在原位,因为都是递增的排序,那么只需要把L2数组的元素赋值给L3中。

代码演示:

void merge(int* nums1, int m, int* nums2, int n) 
{int l1 = m - 1, l2 = n - 1;int l3 = m + n - 1;while (l1 >= 0 && l2 >= 0){if (nums1[l1] > nums2[l2]){nums1[l3] = nums1[l1];l1--;l3--;}else{nums1[l3] = nums2[l2];l3--;l2--;}}while (l2 >= 0){nums1[l3] = nums2[l2];l3--;l2--;}
}

OJ题分为两个类型:

1:接口型(不需要main()函数,我们把代码提交之后,后端会自动拼接main()函数)

2:IO型(需要main()函数)


总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

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

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

相关文章

内存可见性与指令重排序

文章目录 内存可见性内存可见性问题代码演示JMM&#xff08;Java Memory Model&#xff09; 指令重排序指令重排序问题代码演示指令重排序分析 volatile关键字volatile 保证内存可见性 & 禁止指令重排序volatile 不保证原子性 在上一节介绍线程安全问题的过程中&#xff0c…

IT 领域中的主要自动化趋势

48%的IT自动化流程属于IT服务管理&#xff0c;过去一年中&#xff0c;IT运维自动化增长了272%。 IT部门从交付者转变为战略伙伴 今年的《工作自动化指数》数据显示&#xff0c;自动化正在蔓延到组织的各个部门&#xff0c;越来越多的部门采用自动化&#xff0c;并且IT以外的员工…

shell脚本三

目录 一、循环语句 一、循环 二、for循环语句 1.列表循环 2.与c语言循环相似的for循环 3.使用for打印三角形以及乘法表 4.测试172.16.114.0网段存活的主机并将存活的主机IP地址写入文件中&#xff0c;未存活的主机放入另一文件中 三、while循环语句 四、until循环语句…

STM32_5(中断)

中断系统 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行中断优先级&#xff1a;当…

2023年亚太地区数学建模大赛 问题B

玻璃温室中的微气候法规 温室作物的产量受到各种气候因素的影响&#xff0c;包括温度、湿度和风速[1]。其中&#xff0c;适宜的温度和风速是植物生长[2]的关键。为了调节玻璃温室内的温度、风速等气候因素&#xff0c;温室的设计通常采用带有温室风扇的通风系统&#xff0c;如…

从0开始学习JavaScript--JavaScript迭代器

JavaScript迭代器&#xff08;Iterator&#xff09;是一种强大的编程工具&#xff0c;它提供了一种统一的方式来遍历不同数据结构中的元素。本文将深入探讨JavaScript迭代器的基本概念、用法&#xff0c;并通过丰富的示例代码展示其在实际应用中的灵活性和强大功能。 迭代器的…

2023亚太杯数学建模B题思路 - 玻璃温室中的微气候法规

# 1 赛题 问题B 玻璃温室中的微气候法规 温室作物的产量受到各种气候因素的影响&#xff0c;包括温度、湿度和风速[1]。其中&#xff0c;适 宜的温度和风速是植物生长[2]的关键。为了调节玻璃温室内的温度、风速等气候因素 , 温室的设计通常采用带有温室风扇的通风系统&#x…

轻量封装WebGPU渲染系统示例<38>- 动态构建WGSL材质Shader(源码)

实现原理: 基于宏定义和WGSL功能文件实现 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/DynamicShaderBuilding.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#x…

JavaEE 多线程01

为什么引入多线程? 首先进程已经能很好的完成多任务这个情景下的并发编程了,那为什么又引入多线程呢? 这是因为在一些情景下,我么需要大量的创建和销毁进程来完成一些任务,此时多进程对系统的开销就会很大了. 假设有这样一个场景,服务器同时接收到很多个服务请求,这个时候服务…

HSV映射到圆锥坐标系

def bgr2hsvcone(img):arr_hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV)h arr_hsv[..., 0] / 180. * 2s arr_hsv[..., 1] / 255.v arr_hsv[..., 2] / 255.x np.cos(h * np.pi) * s * vy np.sin(h * np.pi) * s * vreturn np.stack((x, y, v), axis-1)

GPIO模式详解:推挽/开漏/浮空/上拉/下拉/施密特(迟滞)输入

GPIO(General Purpose Input Output)可用于执行数字输入或输出功能。典型的应用包括从/向模拟或数字传感器/设备读写数值、驱动LED、为I2C通信驱动时钟、生成外部组件的触发、发出中断等。 文章目录 1 GPIO简介2 输出模式2.1 推挽输出2.2 开漏输出 3 输入模式3.1 高阻态(浮空)、…

Pycharm的程序调试

有如下代码需要进行调试&#xff1a; i 1 while i < 10:print(i)步骤一&#xff1a;设置断点 步骤二&#xff1a;进入调试视图 方式1&#xff1a;右键单击编辑区&#xff1a;点击’Debug模块名’ ​ 方式2&#xff1a;ShiftF9 ​ 方式3&#xff1a;单机工具栏上的调试按钮…