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

news2025/1/14 18:25:07

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

目录

前言

经典算法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.coloradmin.cn/o/1240177.html

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

相关文章

hadoop shell操作 hdfs处理文件命令 hdfs上传命令 hadoop fs -put命令hadoop fs相关命令 hadoop(十三)

hadoop fs -help rm 查看rm命令作用 hadoop fs 查看命令 1. 创建文件夹&#xff1a; # hdfs前缀也是可以的。更推荐hadoop hadoop fs -mkdir /sanguo 2.上传至hdfs命令&#xff1a; 作用&#xff1a; 从本地上传hdfs系统 &#xff08;本地文件被剪切走&#xff0c;不存在了&…

探究Kafka原理-1.初识Kafka

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…

服务器主机安全的重要性及防护策略

在数字化时代&#xff0c;服务器主机安全是任何组织都必须高度重视的问题。无论是大型企业还是小型企业&#xff0c;无论是政府机构还是个人用户&#xff0c;都需要确保其服务器主机的安全&#xff0c;以防止数据泄露、网络攻击和系统瘫痪等严重后果。 一、服务器主机安全的重…

基于STM32的色彩识别与分类算法优化

基于STM32的色彩识别与分类算法优化是一项与图像处理和机器学习相关的研究任务&#xff0c;旨在实现高效的色彩识别和分类算法在STM32微控制器上的运行。本文将介绍基于STM32的色彩识别与分类算法优化的原理和实现步骤&#xff0c;并提供相应的代码示例。 1. 色彩识别与分类概…

深度学习 loss 是nan的可能原因

1 loss 损失值非常大&#xff0c;超过了浮点数的范围&#xff0c;所以表示为overflow 状态下的男。 解决办法&#xff1a; 减小学习率&#xff0c;观察loss值是不是还是nan 在将数据输入模型前&#xff0c;进行恰当的归一化 缩放 2 loss 的计算中存在除以0&#xff0c; log(0…

【docker】docker总结

一、Docker简介 Docker是开源应用容器引擎&#xff0c;轻量级容器技术。基于Go语言&#xff0c;并遵循Apache2.0协议开源Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux系统上&#xff0c;也可以实现虚拟化容…

边云协同架构设计

文章目录 一. "边云协同"是什么&#xff1f;二. "边云协同"主要包括6种协同2.1 资源协同2.2 数据协同2.3 智能协同2.4 应用管理协同2.5 业务管理协同2.6 服务协同 三. "边云协同"的优势 其它相关推荐&#xff1a; 系统架构之微服务架构 系统架构…

Leaflet实现轨迹播放动画效果

效果图如下&#xff1a; <!DOCTYPE html> <html><head><title>轨迹</title><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><!-- 引入样式 -->…

记录小白第一次EDUsrc:任意用户密码重置漏洞

一、漏洞说明&#xff1a; xxxx学院身份认证系统有严重的逻辑设计缺陷&#xff1a;账户登录、手机登录、密码找回三个接口找到n个逻辑漏洞包括任意账号密码修改、信息泄露&#xff08;应该还有更多&#xff0c;但是有很多重复的漏洞&#xff0c;没必要再找了&#xff09; edus…

Mybatis plus 简介

简介 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 官网:https://baomidou.com/pages/24112f/ 特性 无侵入&…

redis---主从复制及哨兵模式(高可用)

主从复制 主从复制&#xff1a;主从复制是redis实现高可用的基础&#xff0c;哨兵模式和集群都是在主从复制的基础之上实现高可用。 主从负责的工作原理 1、主节点&#xff08;master&#xff09; 从节点&#xff08;slave&#xff09;组成&#xff0c;数据复制是单向的&a…

七牛云产品使用介绍之Dora篇

上一篇介绍了七牛云的CDN服务用于实现对静态资源的访问加速&#xff0c;下一个产品该轮到我们可爱的Dora了 Dora全称&#xff1a;智能多媒体服务 介绍&#xff1a;是一种零运维、高可用、高性能的多媒体数据处理服务。提供图片处理、音视频转码、水印、截图、瘦身等基础功能&am…

HuggingFace-利用BERT预训练模型实现中文情感分类(下游任务)

准备数据集 使用编码工具 首先需要加载编码工具&#xff0c;编码工具可以将抽象的文字转成数字&#xff0c;便于神经网络后续的处理&#xff0c;其代码如下&#xff1a; # 定义数据集 from transformers import BertTokenizer, BertModel, AdamW # 加载tokenizer token Ber…

zookeeper单机版的搭建

一 zookeeper的搭建 1.1 上传zkjar包 1.2 搭建配置 1.解压压缩包 [rootlocalhost export]# tar -zxvf zookeeper-3.7.0-bin.tar.gz 2.创建data文件夹 [rootlocalhost export]# cd apache-zookeeper-3.7.0-bin/ [rootlocalhost apache-zookeeper-3.7.0-bin]# ls bin conf…

专业远程控制如何塑造安全体系?向日葵“全流程安全闭环”解析

安全是远程控制的重中之重&#xff0c;作为国民级远程控制品牌&#xff0c;向日葵远程控制就极为注重安全远控服务的塑造。近期向日葵发布了以安全和核心的新版“向日葵15”以及同步发布《贝锐向日葵远控安全标准白皮书》&#xff08;下简称《白皮书》&#xff09;&#xff0c;…

2023年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供&#xff0c;危险化学品生产单位安全生产管理人员证模拟考试题库是根据危…

DDD神药:去哪儿结合DDD,实现架构大调优

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

苹果 CEO 库克在找接班人;大英图书馆确认被勒索软件攻击丨 RTE 开发者日报 Vol.90

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Nginx配置Websocket

WebSocket 和HTTP虽然是不同协议&#xff0c;但是两者“握手”方式兼容。通过HTTP升级机制&#xff0c;使用HTTP的Upgrade和Connection协议头的方式可以将连接从HTTP升级为WebSocket。 Websocket 使用 ws 或 wss 的统一资源标志符&#xff0c;类似于 HTTPS&#xff0c;其中 wss…

【PyGIS】使用阿里AIEarth快速下载指定区域指定年份的土地利用数据

说明 中国逐年土地覆盖数据集(CLCD) 由武汉大学的杨杰和黄昕教授团队基于Landsat影像制作了中国逐年土地覆盖数据集(annual China Land Cover Dataset, CLCD),数据包含1985—2021年中国逐年土地覆盖信息。研究团队基于Landsat长时序卫星观测数据,构建时空特征,结合随机森…