当前位置: 首页 > news >正文

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

双指针法(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.lryc.cn/news/458233.html

相关文章:

  • 镁光DDR3的命名
  • [Git] Git下载及使用 从入门到精通 详解(附下载链接)
  • Linux源码阅读笔记-USB驱动分析
  • 【超级详细解释】力扣每日一题 134.加油站 48. 旋转图像
  • 数据挖掘基本架构知识点
  • LangChain中使用Prompt01
  • 如何使用bpmn-js实现可视化流程管理
  • 【PostgreSQL 】实战篇——如何使用 EXPLAIN 和 ANALYZE 工具分析查询计划和性能,优化查询
  • List、Map、Set 三个接口存取元素时,各有什么特点
  • 掌握 ASP.NET Web 开发:从基础到身份验证
  • 【C++图文并茂】01背包问题不会?超详细的详解,看完保证你会
  • SQL自学:什么是子查询,如何使用它们
  • No.10 笔记 | PHP学习指南:PHP数组掌握
  • RS-232 串口通信和 RS-485 串口通信的区别
  • 【K8s】专题十四(1):Kubernetes 安全机制之 RBAC
  • 8. 多态、匿名内部类、权限修饰符、Object类
  • CentOS/Ubuntu/Debian安装LibeventCentOS安装Libevent库(含示例代码)库(含示例代码)
  • 【大数据】数据采集工具sqoop介绍
  • vite学习教程02、vite+vue2配置环境变量
  • k8s 的网络通信
  • 【编程基础知识】掌握Spring MVC:从入门到精通
  • 多线程下,@Transactional失效解决
  • PyCharm 项目解释器切换指南:如何在项目中更换 Python Interpreter
  • STM32F407寄存器操作(DMA+SPI)
  • Oracle 的 OCP 与 MySQL 的 OCP 的区别
  • 数据治理、数据清洗定义、区别以及数据清洗常用方法
  • web基础-攻防世界
  • Java基础-String Class(字符串类)
  • 《Linux服务与安全管理》| 服务进程与网络配置
  • No.15 笔记 | CSRF 跨站请求伪造