【数据结构c++】双指针(九)

C++ 双指针:从原理到实战的全面解析 双指针是C++中优化线性数据结构问题的高效技巧,通过两个指针协同遍历,能将O(n²)时间复杂度降至O(n)。分为三种经典类型:1)同向双指针(快慢指针),用于数组去重、链表环检测;2)相向双指针(左右指针),适用于有序数组的两数之和等问题;3)滑动窗口双指针,解决子串/子数组相关问题。使用时需注意边界条件、数据结构适配和窗口收缩逻辑。在链表问题中,双指针可高效解决中间节点检测、环判断等典型问题。该技巧通过空间换时间,大幅提升算法效率,是面试和工程实践中的必备技能。 阅读详情

1. 双指针

  • 两数之和 II - 输入有序数组: https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/
    在这里插入图片描述
    在这里插入图片描述

    class Solution
    {
    public:
    	vector<int>twoSum(vector<int>&numbers, int target)
    	{
    		int low = 0, high = numbers.size()-1;
    		while(low < high)
    		{	
    			int sum = numbers[low] + numbers[high];
    			if (sum == target)
    			{
    				return {low+1, high+1};
    			}
    			else if (sum < target)
    			{
    				++low;
    			}
    			else
    			{
    				--high;
    			}
    		}
    		return{-1, -1};
    	}
    
    };
    

    在这里插入图片描述

  • 合并两个有序数组: https://leetcode-cn.com/problems/merge-sorted-array/
    在这里插入图片描述

    在这里插入图片描述

    class Solution {
    public:
        void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
            int p1 = 0, p2 = 0;
            int sorted[m + n];
            int cur;
            while (p1 < m || p2 < n) {
                if (p1 == m) {
                    cur = nums2[p2++];
                } else if (p2 == n) {
                    cur = nums1[p1++];
                } else if (nums1[p1] < nums2[p2]) {
                    cur = nums1[p1++];
                } else {
                    cur = nums2[p2++];
                }
                sorted[p1 + p2 - 1] = cur;
            }
            for (int i = 0; i != m + n; ++i) {
                nums1[i] = sorted[i];
            }
        }
    };
    

    在这里插入图片描述

  • 平方数之和: https://leetcode-cn.com/problems/sum-of-square-numbers/
    在这里插入图片描述
    在这里插入图片描述

    class Solution {
    public:
        bool judgeSquareSum(int c) {
            long left = 0;
            long right = (int)sqrt(c);
            while (left <= right) {
                long sum = left * left + right * right;
                if (sum == c) {
                    return true;
                } else if (sum > c) {
                    right--;
                } else {
                    left++;
                }
            }
            return false;
        }
    };
    
  • 通过删除字母匹配到字典里最长单词: https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting/
    在这里插入图片描述
    在这里插入图片描述

    class Solution {
    public:
        bool isSubsequence(string s, string t) {
            // 判断 t 是否是 s 的子序列
    
            int n = s.size(), m = t.size();
            
            // 如果 t 长度大于 s,一定不是子序列
            if(m > n) return false;
    
            // 记录当前 s 中匹配到了哪个位置
            int i = 0;
            for(char ch : t) {
                while(i < n && s[i] != ch) i++;
                if(i >= n) return false;
    
                // 此时 s[i] = ch,下次要从 s[i + 1] 开始匹配
                i++;
            }
    
            return true;
        }
    
        string findLongestWord(string s, vector<string>& dictionary) {
            // 更长的、字典序更小的排在前面,这样一旦找到,就是结果
            sort(dictionary.begin(), dictionary.end(), [&](string &a, string &b) {
                if(a.size() == b.size()) return a < b;
                return a.size() > b.size();
            });
    
            for(string &t : dictionary) {
                if(isSubsequence(s, t)) return t;
            }
    
            // 如果没找到
            return "";
        }
    };
    
C++ 数据结构实现指南:哈希表、红黑树与双指针算法落地 本文介绍了三种核心数据结构与算法的C++实现:哈希表、红黑树和双指针算法。重点剖析了哈希表的链地址法实现原理,包括哈希函数设计、冲突处理机制和动态扩容策略,并提供了完整的模板化实现代码。红黑树部分则解释了其作为自平衡二叉搜索树的五大特性,以及如何通过颜色约束和旋转操作维持平衡。文章通过从原理到实现的完整讲解,帮助开发者深入理解这些关键技术在实际工程中的应用。 阅读详情

相关推荐

c++中的双指针

在C++中,双指针通常指的是两个指针分别从数组或者序列的两端向中间移动,或者在链表中一前一后同时移动的技巧。这些例子展示了双指针技巧在不同问题中的应用,通过同时移动两个指针,可以在较低的时间复杂度内解决一些常见的算法问题。问题描述:给定一个已排序的整数数组 nums,找出数组中两个数使它们的和等于目标值 target。1.使用两个指针,一个指向数组的起始位置(left),另一个指向数组的末尾(right)。7.使用两个指针,一个慢指针 slow,每次移动一步,一个快指针 fast,每次移动两步。

2401_83378074的博客 932

两个数组的交集、有效的完全平方数、字符串中的第一个唯一字符

位于半山腰的城堡酒店坐拥港口美景 算法是进阶架构师的基础,基础不牢,地动山摇,2021-8-14起开始刷题,目标100天,300道LeetCode算法题,分享是学习的最好方式,加油,嗨起来。 1、LeetCode 350.两个数组的交集 题目 给定两个数组,编写一个函数来计算它们的交集。 小编菜解 public static int[] intersect(int[] nums1, int[] nums2) { List<Integer> list1 = new A..

学Java,找哪吒 4081

C++算法:滑动窗口与双指针

滑动窗口与双指针:一,定长滑动窗口。二,不定长滑动窗口。二a,最长最数组。二b,最短子数组。二c,统计子数组数量(越长越合法)。二d,统计子数组数量(越短越合法)。二e,恰好子数组数量。

闻缺陷则喜何志丹 2000

一维数组案例

// 求最小值(第一种): 需求:获取指定数组中偶数元素值的最小值 Scanner input = new Scanner(System.in); // 1.定义一个 int 数组 arr int[] nums = new int[5]; // 2.键盘录入5个整数,存入数组 arr 中,并且录入之前提示输入的是第几个数字 for (int i = 0; i < nums.length; i++) { System.out.printf("输入第%d个整数:", i+1); num.

weixin_57488568的博客 872

高通camera:PDAF的配置与测试

确认相关log日志都已经打开了之后,判断是在3A算法中没有应用到PDAF,可能是之前在调试AF效果的时候关闭了PDAF,打开效果文件对应的文件夹,在\kamorta_lce_S5K3P9\Scenario.Default\XML\STATS。在log中搜索af_pdaf_proc_pd_single,这个函数是pdaf算法中的,源码被封装了,这里看不到,因此只能通过log打印出来的参数来分析pd是否正确,主要参数有pd ,defocus,confidence。PDAF的配置与测试。

arvin_xiong的博客 2485

RK3588+TRL8367s 四网口千兆交换机配置与优化实战

本文详细介绍了基于RK3588高性能SoC与TRL8367s千兆交换芯片构建四网口交换机的完整实战流程。内容涵盖硬件连接、设备树配置、内核驱动加载、性能优化及常见问题排查,重点解析了RGMII时序调试、DSA架构配置等关键步骤,为嵌入式网络设备开发提供实用指南。

weixin_29266647的博客 672

范围for循环

foreach遍历学习`for(int num : nums2)` for(int num : nums2) 刚开始学习C++,在leetcode看到大神写的代码中有 for(int num : nums2) 一脸懵逼 怀疑自己看了个假视频,学的C++是上个世纪的,从网上查找了下资料,特此整理学习! 其实这就是简化的循环写法,善于观察的同学结合上下代码语句,应该猜个大概。 等同于 int num; for(int i=0;i<nums.length;i++) { num=nums2[i]; } 文

HFGD2019的博客 6649

LLMOps的崛起:如何利用Langfuse和Opik构建高效的模型监控与评估体系

本文探讨了LLMOps的崛起,详细介绍了如何利用Langfuse和Opik构建高效的模型监控与评估体系。通过开源工具Langfuse的全景监控方案和Opik的三层评估体系,帮助AI工程团队实现大语言模型的全生命周期管理,提升模型性能和迭代效率。文章还提供了实战技巧和工具链集成方案,助力企业优化AI应用。

ll5678的博客 680

349. 两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序 解答: class Solution { public: vector<int> intersection(vector<int>&

WhiteGray的博客 239

TPS5430/54302调试血泪史:从‘烫手山芋’到冒烟烧板,我的5V电源到底怎么了?

本文深入剖析了TPS5430/TPS54302 DCDC电源芯片调试中的常见问题,包括异常发热、电压漂移等,并提供了从热设计到PCB布局的全面解决方案。通过实战案例,揭示了数据手册中未明确的‘潜规则’,帮助工程师避免烧板风险,提升电源系统稳定性。

weixin_28744423的博客 500

GD32F4xx 移植agile_modbus软件包与电能表通信

GD32F4XX 移植agile modbus软件包实现与DTSU电能表通信调试记录

madao1234的博客 1303

leetcode小白随笔记(二)

auto类型说明符 用它就能让编译器替我们去分析表达所属的类型。 string对象上的操作 初始化的方式 string对象 上的操作 标准库类型vector 定义和初始化vector对象 迭代器介绍 标准容器迭代器的运算符 使用迭代器,不使用小标操作,避免随机访问 容器操作 获取迭代器 将一个容器初始化为另一个容器的拷贝 将一个新容器创建为另一个容器的拷贝的方法有两种:可以直接拷贝整个容器,或者(array除外)拷贝一个迭代器对指定的元素范围。 截图来自:C++_Primer_第5版_中文 vector初始

花开 流年 739

RK3588 hdmirx 调试(含v4l2工具,edid编辑)

RK3588 Buildroot系统中调试HDMI-RX的过程,包括抓图、修改EDID数据、编辑EDID等操作。首先,通过logcat和寄存器信息查询HDMI-RX的状态,使用v4l2-ctl工具进行测试和修改EDID。

501846585_QQAndroid_java 2683

C++算法学习专题:双指针

双指针(Two Pointers)是一种非常实用且高效的算法思想,主要用于处理线性数据结构(如数组、链表等)中的特定问题。这种技术通过使用两个指针(或索引)在数据结构中协同遍历,能够显著优化算法的时间复杂度。

2401_89119815的博客 994

Vue+OpenLayers:解决中国境内OpenStreetMap地图加载问题

然而,在使用OpenLayers和Vue框架搭建地图应用时,很多中国开发者可能会遇到一个常见问题:OpenStreetMap(OSM)地图无法正常加载。为了解决这个问题,我们可以使用其他方式获取地图数据,比如使用国内的地图服务提供商。通过使用国内地图服务商提供的地图数据,我们可以解决OpenStreetMap地图加载问题。然后,我们创建一个OpenLayers地图对象,并指定地图图层的源为国内地图服务商提供的地图URL。属性,可以将地图的中心点和缩放级别调整到我们需要的位置。

CodeWhizZ的博客 8270

【YOLOv8全方位学习手册】第四章 数据增强:从扩充数据到塑造模型的认知边界

"""使用 Albumentations 做自定义增强,兼容 YOLO 格式"""])# 转成 numpy# boxes 必须是 [[x_min,y_min,x_max,y_max], ...]# 在数据加载时调用你可以把集成到 PyTorch 的 Dataset 类里,或使用 Ultralytics 自带的DataLoader。

VectorShift的博客 211

C++实现字符串元音字母反转的巧妙方法【数据结构、双指针】

在处理字符串元音反转的问题时,利用数据结构和双指针法都是有效的解决方案。数据结构方法通过存储元音的位置和字符来实现反转,而双指针法通过两端同时向中间移动指针来找到需要交换的字符。这两种方法各有优劣,具体选择取决于问题的规模和对空间复杂度的要求。

qq_22841387的博客 1016

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

双指针技巧在C++中的应用:从基础到进阶

在算法题中,双指针具有很多应用,那么在实际项目中,你有使用过双指针技巧吗?主要是什么场景?欢迎评论区交流讨论~推荐阅读滑动窗口算法详解:概念、应用与实例,-优快云博客C++合并两个有序数组-优快云博客。

红军不怕远征难,万水千山只等闲 1295

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

双指针算法及模板应用

双指针算法 举例:分行输出字符串 基本思路:采用双指针算法 模板应用 最长连续不重复子序列 双指针算法模板: 双指针基本思路: 代码 数组元素的目标和 判断子序列

timerring的博客 6562

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++数据结构与算法——双指针法

C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用来学习,刷题使用力扣网站,不定时更新,欢迎关注!

weixin_63866037的博客 1432

【数据结构与算法】双指针算法

我们还有更长的路要走,不过没关系,道路就是生活。

hsy1603914691的博客 2039

双指针算法大总结!!看完这篇文章再也没有难的双指针题!!例题C++解法!

题源acwing、力扣讲解双指针题目一:盛最多水的容器思路AC代码题目二:查找总价格为目标值的两个商品思路AC代码题目三:链表的中间节点思路AC代码题目四:环形链表思路AC代码题目五:反转字符串中的元音字符思路AC代码题目六:最长连续不重复子序列思路AC代码题目七:判断子序列思路AC代码 讲解双指针 使用双指针是降低算法复杂度的一个有效途径,有些问题的暴力解法时间O(n2),但是使用双指针可以大幅度降低算法复杂度。 和贪心算法一样,双指针难在想不到 常用的双指针法有以下几类: 左右指针:两个指针,相向而走,

weixin_45962681的博客 2016

C++中的双指针和三指针

在C++中,双指针和三指针分别是指向指针的指针和指向指向指针的指针。它们的主要作用是处理复杂的数据结构、动态内存分配以及通过函数参数修改指针。它们的详细解释、使用场景以及具体示例,我有贴一些代码在相关内容下面。- 双指针的声明形式是`,例如 `int **ptr;- 初始化时,可以通过动态内存分配来创建指向指针的指针。- 分配内存:使用循环为每一行分配内存。- 访问元素:通过双重下标访问数组元素,如 `- 释放内存:首先释放每一行的内存,然后释放指针数组。

GOLOJO的博客 1425

探索C++双指针算法:原理、应用与实战代码详解

💪理解并熟练掌握双指针算法不仅能提升编码效率,更能锻炼逻辑思维能力。无论是在面试还是项目开发中,适时运用双指针对解决问题都能起到事半功倍的效果。现在就开始在实践中运用双指针算法,感受它带来的编程魅力吧!

qq_44740112的博客 1544

算法技巧——双指针算法

前置知识 C 和 C++ 的数组、指针。 什么是双指针 严格的来说,双指针只能说是是算法中的一种技巧。 双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。 双指针问题套路 通俗的说,就是在数组遍历中,我们使用两个指针进行操作。所以双指针问题基本有以下几个细节: 1、双指针的初始位置。根据双指针的分类,有两种可能。具体看下面的介绍。 2、双指针的移动方法。根据双指针的分类,有两种可能。具体

努力中的老周的专栏 1万+

优选算法《双指针》

在这些算法中我们先来了解的是一些非常经典且较为常用的算法,在此也就是优选出来的算法,接下来在每一篇章中我们都会来学习一种优选算法,并且在了解了算法原理之后接下来会通过几道算法题来巩固相应的算法原理。在每道算法题的讲解中都会通过。三步来带你完全吃透每道算法题,相信通过这一系列算法专题的学习,你的算法以及代码能力会有质的飞跃。接下来就开始本篇双指针专题算法的学习吧!在学习了C/C++的基础知识之后接下来我们就可以来系统的学习相关的算法了,这在之后的。

mljy.博客 3735
上一篇: 【数据结构C++】数据结构相关篇
下一篇: 【面试】C++常见的面试问题
只搬烫手的砖
博客等级 码龄8年 4279粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只搬烫手的砖

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值