C++ 算法学习——7.4.1 优化算法——双指针

news/2024/10/8 21:16:35 标签: c++, 算法, 学习

双指针法(Two Pointers)是一种常用的算法技巧,通常用于解决数组或链表中的问题。这种技巧通过维护两个指针,通常分别指向数组或链表的不同位置,来协同解决问题。双指针法一般有两种类型:快慢指针和左右指针。

快慢指针(Slow-Fast Pointers)

  • 概念:快慢指针是指两个指针,一个快指针和一个慢指针,它们以不同的速度移动来解决问题。慢指针一般每次移动一个位置,而快指针一般每次移动两个或多个位置。

  • 应用场景:常用于判断链表是否有环(快慢指针在环形链表中一定会相遇)、链表中点、链表倒数第K个节点等问题。

左右指针(Two Pointers)

  • 概念:左右指针是指两个指针,一个指向开始位置(左指针),一个指向结束位置(右指针),它们向中间移动解决问题。

  • 应用场景:常用于有序数组或链表中的查找、求和、两数之和等问题。左右指针可以根据问题的特点进行不同的移动策略,比如向内移动、向外移动或向中间移动。

双指针算法的优势

  • 时间复杂度:双指针算法通常时间复杂度较低,因为每个指针只遍历一次数组或链表。

  • 空间复杂度:双指针算法通常不需要额外的空间,只需要常数级的额外空间。

  • 可解决问题:双指针算法可以解决许多数组和链表相关的问题,包括查找、求和、判断等。

示例

  • 快慢指针:判断链表是否有环。

  • 左右指针:在有序数组中找到两个数使它们的和等于目标值。


P1. 洛谷p1102A-B数对

分析:双指针优化算法常常是让找东西更方便,而查找有序区间是最优的,最坏也是o(n)级别的时间复杂度。而原数组排序后,所要找的A存在的区间B存在的区间宏观大小上就相差一个C。而查找这样的区间,使用双指针必然可以得到优化。

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    int n,c;cin>>n>>c;
    int* nums=new int[n];
    for(int i=0;i<n;i++)
    {
        cin>>nums[i];
    }
    long long result=0;
    sort(nums,nums+n);
    int left=0;int right=0;
    //for(int i=0;i<n;i++) cout<<nums[i]<<" ";
    for(int dexa=0;dexa<n;dexa++)
    {
        while(right<n&&nums[right]-nums[dexa]<=c) right++;
        while(left<n&&nums[left]-nums[dexa]<c) left++;
        if(nums[dexa]-nums[left]==-c&&nums[dexa]-nums[right-1]==-c&&right-1>=0)
        result+=(right-left);
    }
    cout<<result;
    return 0;
}


http://www.niftyadmin.cn/n/5694811.html

相关文章

【EXCEL数据处理】保姆级教程 000016案例 EXCEL的vlookup函数。

【EXCEL数据处理】000016案例 vlookup函数。 前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】保姆级教…

哭晕,腾讯的面试太难了。。。

国庆假期刚结束&#xff0c;马上就收到了一位粉丝分享的腾讯音乐面试经历。这是一场质量很高的面试&#xff0c;大厂面试官确实实力强劲。 但是由于一直忙于交接和工作&#xff0c;他完全裸面&#xff0c;所以在面试后直呼&#xff1a;“想哭&#xff0c;面试中全程被面试官牵…

QT 通过鼠标事件实现图片的拖动和缩放

通过鼠标拖动来移动图片&#xff0c;并使用鼠标滚轮来缩放图片。 1、实现步骤&#xff1a; 1、移动图片&#xff1a; 使用QPoint记录图片的偏移量&#xff0c;当鼠标拖动时更新这个偏移量&#xff0c;在paintEvent()中根据偏移量绘制图片。2、缩放图片&#xff1a; 使用滚轮…

Linux概念扫盲 3

目录 常见的Linux指令备忘 pwd ls cd cat more head, tail grep find locate mv cp rm chmod ln Helps Reference 常见的Linux指令备忘 在我们进一步研究Linux之前&#xff0c;首先需要熟悉一些最为常见的指令。笔者混迹于一些常见的Linux交流群发现很多问题在各…

Chromium 搜索引擎功能浅析c++

地址栏输入&#xff1a;chrome://settings/searchEngines 可以看到 有百度等数据源&#xff0c;那么如何调整其顺序呢&#xff0c;此数据又存储在哪里呢&#xff1f; 1、浏览器初始化搜索引擎数据来源在 components\search_engines\prepopulated_engines.json // Copyright …

第170天:应急响应-战中溯源反制对抗上线CSGoby蚁剑Sqlmap等安全工具

目录 案例一&#xff1a;溯源反制-Webshell工具-Antsword 案例二&#xff1a;溯源反制-SQL注入工具-SQLMAP 案例三&#xff1a;溯源反制-漏洞扫描工具-Goby 案例四&#xff1a;溯源反制-远程控制工具-CobaltStrike 反制Server&#xff0c;爆破密码&#xff08;通用&#x…

如何获取网页内嵌入的视频?

如何获取网页内嵌入的视频&#xff1f; 有时插件无法识别的视频资源&#xff0c;可以通过手动使用浏览器的开发者工具来抓取。你可以按照以下步骤操作&#xff1a; 步骤&#xff1a; 打开网页并按 F12&#xff1a;在视频页面按下 F12 或右键点击网页并选择“检查”或“Inspe…

【深度学习】自动微分——Autodiff or Autograd?

论文 [1].CSC321 Lecture 10: Automatic Differentiation [2].Automatic Differentiation in Machine Learning:a Survey 关键点总结&#xff1a; 雅可比矩阵&#xff1a;对于多变量函数 y ⃗ f ( x ⃗ ) \vec{y} f(\vec{x}) y ​f(x )&#xff0c;其梯度矩阵&#xff08;…