数据结构·顺序表经典例题(双指针)

        本节讲解两道顺序表经典例题,运用到了双指针的思想

        双指针并不是两个指针,而是用两个类似指针的东西去扫描数组,以达到简化运算的效果

1. 移除元素

        OJ链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

        本体给出一个数组 nums 和一个值 val 。目标是在不创建新数组的情况下,在这个数组本体上的内容中删掉所有值是 val 的元素。

1.1 解题思路

1.1.1 方法一

        遍历数组,每找到一次val就把后面的所有数据往前挪一位,覆盖掉这个val。很明显,这种两层for循环的写法效率是低下的

                                

1.1.2 方法二:双指针

        创建两个变量 src(source) 和 dst(destination) 他俩就作为双指针管理这个数组。dst控制下一次写入的地方,src控制下一次写入的内容。

        解题思路就是让src往后扫描,扫到 val 就跳过,扫到 !val 就写到dst指向的位置,等src扫完整个数组之后det就标记了所有 !val 的有效数据的结尾

        扫描开始和扫描结束时候的样子就如上图一样,读者可以想像一下扫描中间的过程

        最后附上本题代码:

int removeElement(int* nums, int numsSize, int val)
{
    int src = 0, dst = 0;
    //用src扫描整个数组
    while (src < numsSize)
    {
        //如果src碰到非val
        if (nums[src] != val)
        {
            //将数据拿到前面
            nums[dst] = nums[src];
            dst++;
            src++;
        }
        //如果src碰到val就什么都不做
        else
        {
            src++;
        }
    }
    return dst;
}

        

2.  合并两个有序数组

        OJ链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

        本体给出两个按非递减顺序排好的数组 nums1 和 nums2 它们中的有效数据分别有 m 和 n 个,nums1的长度是m+n 就是说数组 nums1 中有足够空间存下两个数组的所有有效元素。本体目的是将nums2中的数据放到nums1中,并保证 nums1 中的所有数据是按非递减顺序排序的

        ​​​​​​​        

2.1 解题思路

2.1.1 方法一

        把 nums2 中的数据无脑用 strcat() 放到 nums1 的后面,然后用 qsort 给 nums1 排序

2.1.2 方法二:双指针思路

        这道题我们要先思考好指针要怎么放,如果从前面开始扫描并插入数据的话,势必会造成后面数据的整体挪移,这是双指针算法不想看到的。

        所以我们让指针从后向前扫描,我们设置3个指针,l1 和 l2 比较,谁大就放到 l3 的位置去,这样的话就不会妨碍到有效数据,也就是说不用整串挪移数据了,简单来讲就是说总是把两个数组中最大的那个值放到最后那个空着的位置

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        但是有一些特殊的情况要注意一下,就是当 l1 扫完了但是 l2 没扫完,这种情况下再把nums2中的内容直接都粘到 l3 那里就行了

          

        最后是本题代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
	int l1 = m - 1, l2 = n - 1, l3 = m + n - 1;

	//l1 l2从后往前扫描,把最大的数放到后面
	while (l1 >= 0 && l2 >= 0)
	{
		if (nums1[l1] > nums2[l2])
		{
			nums1[l3] = nums1[l1];
			l1--;
			l3--;
		}
		else
		{
			nums1[l3] =nums2[l2];
			l2--;
			l3--;
		}
	}

	//此时处理特殊情况
	while (l2 >= 0)
	{
		nums1[l3] = nums2[l2];
		l2--;
		l3--;
	}
}

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

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

相关文章

五、Flask学习之MySQL

五、Flask学习之MySQL 1. 下载MySQL 下载教程&#xff1a;MySQL安装及可视化工具SQLyog下载 2.常用指令 2.1. 查看已有数据库 show databases;2.2. 创建数据库 create database 名字 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;2.3. 删除数据库 drop database 名字;…

《WebKit 技术内幕》学习之十五(4):Web前端的未来

4 Cordova项目 Cordova是一个开源项目&#xff0c;能够提供将Web网页打包成本地应用格式的可运行文件。读者可能对Cordova项目陌生&#xff0c;但是大家可能对它的前身非常熟悉&#xff0c;那就是PhoneGap项目&#xff0c;它后来被Adobe公司收购。 图15-4描述了Cordova的主要工…

Topaz Video AI:无损放大,让你的视频更清晰!

在当今的数字时代&#xff0c;视频内容的重要性越来越受到人们的关注。无论是在社交媒体上分享生活片段&#xff0c;还是在商业领域中制作宣传视频&#xff0c;人们都希望能够展现出更高质量的视频内容。 然而&#xff0c;由于各种原因&#xff0c;我们经常会面临一个问题&…

港口集装箱堆场温湿度监控MQTT无线传输智能节点

设备互联互通的时代已经到来&#xff0c;不同的设备之间需要实现数据互通&#xff0c;提高生产效率和管理效率。因此&#xff0c;一款功能齐全、性能稳定的设备显得尤为重要。我们来介绍一款4G/5G无线远程io模块。具有8DI兼容干湿节点、4DO继电器、6AI可选电流型4-20mA电压型0-…

常规的管理系统除了适用该有的范儿一定要有!气质上不能输

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 常规的管理系统除了适用该有的范儿一定要有!气质上不能输 在现今快速发展的商业环境中…

HCIA学习作业三

要求&#xff1a; 拓扑图&#xff1a; <AR1>ping 5.5.5.1 <AR1>display ip interface brief <AR1>display ip routing-table <AR1>display ip routing-table protocol static <AR2>ping 5.5.5.1 <AR2>display ip interface brief <…

openssl3.2 - 测试程序的学习

文章目录 openssl3.2 - 测试程序的学习概述笔记openssl3.2 - 测试程序的学习 - test\aborttest.copenssl3.2 - 测试程序的学习 - test\sanitytest.copenssl3.2 - 测试程序的学习 - test\acvp_test.copenssl3.2 - 测试程序的学习 - test\aesgcmtest.cEND openssl3.2 - 测试程序的…

Redis2-事务 连接Java 整合springboot 注解缓存

一、订阅和发布 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 Redis的发布和订阅 客户端订阅频道发布的消息 频道发布消息 订阅者就可以收到消息 发布订阅的代…

C# 使用 SapNwRfc 调用SAP RFC

好久没写过相关代码&#xff0c;今天又来贡献一篇 C# 使用 SapNwRfc 调用SAP RFC。用VS2022的WINFORM应用程序&#xff0c;使用NuGet中的SapNwRfc类库&#xff0c;call SAP系统中的RFC&#xff0c;传入7个参数&#xff0c;得到RFC返回的2张表的数据。 一、VS2022中新建WINFORM…

【汇总】解决Spring-Web与Spring-WebFlux冲突

【汇总】解决Spring-Web与Spring-WebFlux冲突 问题发现问题解决问题一&#xff1a;The bean requestMappingHandlerMapping, defined in class path resource [org/springframework/web/reactive/config/DelegatingWebFluxConfiguration.class],问题二&#xff1a;The Java/XML…

C语言-算法-背包

[USACO07DEC] Charm Bracelet S&#xff08;01背包&#xff09; 题目描述 Bessie has gone to the mall’s jewelry store and spies a charm bracelet. Of course, she’d like to fill it with the best charms possible from the N (1 ≤ N ≤ 3,402) available charms. E…

基于frp工具实现内网穿透,跨局域网远程SSH登录

文章目录 一.概述1.1 为什么要内网穿透&#xff1f;1.2 什么是frp&#xff1f; 二.frp安装管理流程2.1 frp下载2.2 部署2.3 通过systemd系统服务管理启动程序 三.frp配置测试&#xff08;通过SSH访问内网机器C&#xff09;3.1 服务端配置文件frps.toml修改3.2 客户端配置文件fr…

深入解析HTTPS:安全机制全方位剖析

随着互联网的深入发展&#xff0c;网络传输中的数据安全性受到了前所未有的关注。HTTPS&#xff0c;作为HTTP的安全版本&#xff0c;为数据在客户端和服务器之间的传输提供了加密和身份验证&#xff0c;从而确保了数据的机密性、完整性和身份真实性。本文将详细探讨HTTPS背后的…

护眼落地灯哪个牌子更好更专业?经典落地灯排名

不知道各位家长有没有发现&#xff0c;近几年来小小年纪就戴眼镜的孩子真的越来越多了&#xff01; 根据专家数据统计&#xff0c;在全国青少年近视率中小学生就占其40%比重&#xff0c;也代表了10个学生中就有4、5个是戴眼镜的。造成这个趋势的原因也不难理解&#xff0c;一是…

多个SSH-Key下,配置Github SSH-Key

首先&#xff0c;检查 github 的连接性&#xff0c;因为DNS污染的原因&#xff0c;很多机器ping不通github&#xff0c;就像博主的机器&#xff1a; 怎么解决DNS污染的问题&#xff0c;博主查了很多教程&#xff0c;测试出一个有效的方法&#xff0c;那就是修改hosts文件。host…

dubbo和eureka的区别

dubbo可以作为客户端&#xff0c;也可以作为服务端&#xff0c;因此他内置了很多序列化框架可供选择&#xff0c;通过配置可以进行选择。默认是hession&#xff0c;还有gson&#xff0c;fastJson&#xff0c;jdk自带的序列化。 eureka只能作为服务端&#xff0c;他序列要与客户…

01_ESP32 MicroPython开发环境搭建

一、工作原理 Python源代码->Python解释器(MicroPython)-->二进制代码(01010)-->硬件电路(ESP32)-->高低电平输出-->其他设备 二、准备工作&#xff1a; 硬件&#xff1a;ESP32开发版&#xff0c;有很多个版本可选&#xff0c;我这里用的是ESP-32开发板&…

关于一个微信自动回复的平台

这是去年整的项目&#xff0c;源码在此。那个时候刚好在学习golang&#xff0c;那么学了那不得用起来嘛&#xff1f;于是就mk代码。 基本功能如下 pc端&#xff1a;主要功能就是登陆微信。 微信小程序&#xff1a;主要是为了方便管理自动回复的状态&#xff0c;在pc端登陆完…

【CANoe使用大全】——报文发送(IG)

&#x1f64b;‍♂️【CANoe使用大全】系列&#x1f481;‍♂️点击跳转 文章目录 1.仿真报文概述2.IG模块的使用2.1.IG模块打开方式 3.添加报文4.添加报文后的配置4.1.发送方式配置4.1.1.鼠标触发4.1.2.键盘触发4.2.3.周期发送 4.3 信号值修改编辑 1.仿真报文概述 报文发送一…

每日一题——LeetCode1346.检查整数及其两倍数是否存在

方法一 循环查找 用indexOf查找每个元素的两倍是否存在在数组中&#xff0c;找到了就直接return true&#xff0c;循环结束还没找到就return false var checkIfExist function(arr) {for(let i0;i<arr.length;i){let index arr.indexOf(arr[i]*2)if(index>0 &&…