【双指针算法】-- 左右指针

左右指针

  • 前言
  • 一、双指针算法
  • 二、左右指针
    • 1.用于在已排序数组中找到两个数使其和为特定值
    • 2.在字符串中判断是否为回文
  • 总结


前言

今天在刷Leetcode的时候觉得自己双指针掌握的还是不错的记录一下,写个学习笔记,也方便以后翻阅,如果也帮助到你了,那真是太好啦! 本篇介绍的是左右指针


一、双指针算法

双指针算法(Two Pointers Algorithm)是一种常用于数组或链表等数据结构的算法思想。它通常涉及到使用两个指针,它们可能位于数组的不同位置,以便在数组中进行某种操作或搜索。双指针算法的目标是通过调整指针的位置来解决问题。在实际应用中,双指针算法常常能够在O(n)的时间复杂度内解决问题。

  • 快慢指针
  • 左右指针
  • 滑动窗口
  • 对撞指针

二、左右指针

  • 用于在已排序数组中找到两个数使其和为特定值。
  • 在字符串中判断是否为回文。

左右指针分别从数组或字符串的两端出发,根据问题的要求,通过移动指针的位置来解决问题。
在这里插入图片描述

1.用于在已排序数组中找到两个数使其和为特定值

#include <vector>std::vector<int> twoSum(std::vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;//始终保持左指针在右指针左边while (left < right) {int currentSum = nums[left] + nums[right];//两数之和大于目标值,右指针左移if (currentSum > target) {right--;//两数之和小于目标值,左指针右移} else if (currentSum < target) {left++;} else { //两数之和等于目标值return {nums[left], nums[right]};}}return {}; // 如果找不到符合条件的数对
}

在leetcode中如题15–三数之和
在这里插入图片描述
因为是双指针加一层循环,时间复杂度为O(N^2)

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int nums_size = nums.size();vector<vector<int>> ans;if (nums_size < 3) return ans;std::sort(nums.begin(), nums.end());for (int i = 0; i < nums_size; i++) {if (nums[i] > 0) return ans;if (i > 0 && nums[i] == nums[i - 1]) continue;//去重int left = i + 1;int right = nums_size - 1;while (left < right) {if (nums[i] + nums[left] + nums[right] < 0) {left++;}else if (nums[i] + nums[left] + nums[right] > 0) {right--;}else {ans.push_back(vector<int>{nums[i], nums[left], nums[right]});left++;right--;while (left < right && nums[left] == nums[left - 1]) left++;//去重while (left < right && nums[right] == nums[right + 1]) right--;//去重} }}return ans;}
};

题18–四数之和
在这里插入图片描述

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {int nums_size = nums.size();std::sort(nums.begin(), nums.end());   //排序vector<vector<int>> ans;if (nums_size < 4) return ans;         //排除特殊情况for (int i = 0; i < nums_size; i++) {  //遍历if (i > 0 && nums[i] == nums[i - 1]) continue;//去重for (int j = i+1; j < nums_size; j++) {   //三数之和if (j > i + 1 && nums[j] == nums[j - 1]) continue;//去重int left = j + 1;int right = nums_size - 1;while (left < right) {if (long (long(nums[i]) + long(nums[j]) + long(nums[left]) + long(nums[right])) < target) {left++;}else if (long (long(nums[i]) + long(nums[j]) + long(nums[left]) + long(nums[right])) > target) {right--;}else {ans.push_back(vector<int>{nums[i], nums[j],nums[left],nums[right]});left++;right--;while (left < right && nums[left] == nums[left - 1]) left++;  //去重while (left < right && nums[right] == nums[right + 1]) right--; //去重}}}}return ans;}
};

这里的四数之和其实就是遍历了一遍三数之和,所以时间复杂度为O(N^3),注意这两题在做右指针的基础上,还需要考虑去重排序

2.在字符串中判断是否为回文

回文是指一个字符串从左到右读和从右到左读是一样的,如’‘tyjjyt’’

#include <string>bool isPalindrome(const std::string& s) {int left = 0;int right = s.size() - 1;//始终保持左指针在右指针左边while (left < right) {if (s[left] != s[right]) {return false;}left++;right--;}return true;
}

总结

以上就是今天总结的内容,是很简单很实用的算法,主要具体的还是根据题目随机应变,后续也会继续记录学习的一些算法呀,唐怡佳继续加油!

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

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

相关文章

js创建服务器,以及对接口的理解和创建

// 创建服务 const app http.createServer((req, res)>{ // 设置给前端返回信息的字符编码 res.setHeader(content-type, text/html; charsetutf-8) let address req.url.split(?)[0] //首先创建一个数组&#xff0c;后面把它的数据放在JSON文件 let…

医院配电能效监管方案

摘要:本文以医院能源监管系统为研究对象,采用智能化技术组建数据库、构建智能化的能耗信息管理系统,实现对医院的能源利用状况进行实时、准确的动态监管。具体而言,该系统建设的主要功能是对医院的能源消耗进行采集、上报、汇总与分析,并生成动态的数据和报表曲线,以及利用分析…

js实现将一张红色透明图改成黑色

获取到像素点&#xff0c;遇到255红色rgb的改为黑色0 ps:红色的rgb为255 0 0 function test(base64) {// 创建一个Canvas元素var canvas document.createElement("canvas");var context canvas.getContext("2d");var redStamp new Image();redStamp.src…

如何在Windows Redis中设置密码?

https://www.python100.com/html/3NQ9A968M2JX.html springboot 工程配置文件 application.yml 中配置如下 redis: timeout: 50000 port: 6379 host: 127.0.0.1 password: 123456 注意 password: 123456 冒号后有空格

SAP ABAP ZPL打印

前言 本文用于简单介绍在SAP中使用ZPL语言进行打印的开发步骤&#xff0c;由于对ZPL语言并不是很熟悉&#xff0c;所以ZPL相关的部分并不会很深入&#xff0c;主要介绍在SAP端如何动态填充ZPL内容及预览、打印。 什么是ZPL ZPL是斑马条码打印机工业型号用的编程语言。利用这些…

M3u8视频地址如何转为mp4视频

在当今数字化的时代&#xff0c;视频格式的转换已成为日常需求。M3u8格式的视频由于其分段的特性&#xff0c;常常给播放和编辑带来不便。而MP4格式则因其通用性和高质量而广受欢迎。那么&#xff0c;如何将M3u8视频地址转换为MP4格式呢&#xff1f;接下来&#xff0c;我们将为…

JRT代码结构调整和示例

之前一直没建表专门使用ORM的api&#xff0c;做模板设计器需要建表&#xff0c;就一边开发设计器一般测试和调整ORM的api&#xff0c;只有做业务才能知道哪些api使用别扭&#xff0c;写了设计器之后改进了ORM的api以方便业务操作数据库。新写法差不多是ORM操作数据库的稳定api了…

向日葵远程控制软件MySQL5.7的安装与配置

目录 一. 向日葵远程控制软件 1.1 简介 1.2 选择原因 1.3 安装及使用 1.4 使用场景 二. MySQL5.7 安装与配置 2.1 什么是MySQL 2.2 安装 MySQL5.7 2.2.1 安装步骤 2.2.2 内部连接 2.2.3 外部连接 三. 思维导图 一. 向日葵远程控制软件 1.1 简介 向日葵电脑版是一款拥有多年…

通信领域常见缩写说明

一、通信通用指标 QoS&#xff1a;Quality of Service(服务质量) 服务质量&#xff08;Quality of Service&#xff0c;QoS&#xff09;是指网络或通信系统为满足用户对服务质量的要求而采取的措施和技术。QoS描述了网络或通信系统在提供服务时对各种性能指标的控制和保证。它…

Java基础-----集合类(四)

文章目录 1. Iterator和ListIterator1.1 简介1.2 常用方法 2. remove方法2.1 比较foreach方式和迭代器方式删除元素2.2 找原因 -- 迭代器删除操作源码 1. Iterator和ListIterator 1.1 简介 1.Iterator 可以遍历List集合&#xff0c;也可以遍历Set集合&#xff1b; ListIterat…

05-SpringCloud-RabbitMQ-概述

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&am…

常用开源渗透测试工具

信息搜集工具 ARL 资产侦察灯塔https://github.com/TophantTechnology/ARLAsamF 资产收集工具https://github.com/Kento-Sec/AsamFshuize信息搜集https://github.com/0x727/ShuiZe_0x727ENScan 企业信息搜集https://github.com/wgpsec/ENScan_GOEHole 指纹探测工具https://git…

HarmonyOS简介

HarmonyOS的起源 HarmonyOS的诞生可以追溯到华为对物联网时代的探索和布局。随着物联网技术的快速发展&#xff0c;华为看到了一个更加互联互通的世界的潜力&#xff0c;并决定开发一个全新的分布式操作系统来满足物联网设备的需求。因此&#xff0c;HarmonyOS在2019年由华为正…

从Windows 1.0到Windows 10的旅程:探索Windows系统的起源和第一个版本特点

学习目标&#xff1a; 了解Windows系统的发展历程和重要版本。理解每个版本的特点和改进。掌握每个版本的发布时间和重要功能。了解Windows系统对于个人用户和企业用户的市场影响。探索Windows系统在用户界面、性能优化和安全性方面的改进。理解Windows系统的持续创新和用户反…

Linux安装rabbitMq RPM安装 以及带延迟插件

rabbitmq安装 文档中rabbitmq下载链接 以及延迟插件 网盘下载 目前下载文件中版本已经过多个服务器安装测试 完全成功 1.安装执行 rpm -ivh openssl-libs-1.0.2k-19.el7.x86_64.rpm --force --nodeps rpm -ivh libnsl-2.34-28.el9_0.x86_64.rpm --force --nodeps rpm -ivh e…

Leetcode 70 爬楼梯

题意理解&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。其中每次只能爬1阶或2阶。 问&#xff1a;爬到楼顶有几种走法&#xff1f; 如: n1 爬一阶&#xff1a; 1 n2 爬两阶&#xff1a; 11 要么从第1阶再爬一阶&#xff0c;要么从第0阶&#xff0c;一次性爬两阶…

京东商品详情API:数据分析和挖掘以优化销售策略

京东商品详情API提供的数据分析和挖掘功能可以帮助商家优化销售策略&#xff0c;提高销售额和用户转化率。以下是一些可能的应用场景&#xff1a; 商品关联分析&#xff1a;通过分析商品之间的关联规则&#xff0c;商家可以发现哪些商品经常一起被购买&#xff0c;从而制定捆绑…

c++ / day04

1. 整理思维导图 2. 全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){blood-0;}&#xff0c;法师类继承自英雄类&a…

跟cherno手搓游戏引擎【1】:配置与入口点

环境配置&#xff1a; 编译环境&#xff1a;VS2019 创建两个项目&#xff1a; 设置Sandbox为启动项&#xff1a; 设置sandbox的配置属性-常规-输出目录\中间目录为如下&#xff1a; 预处理定义&#xff1a;为了配置一些只有windows才能用的函数。 设置YOTOEngin&#xff08;我…

【大数据HA】keepalived结合haproxy实现高可用的HMS

背景 上一篇实现了haproxy代理后端HMS服务实现高可用。但是对于haproxy还是单点故障&#xff0c;所以需要对haproxy进一步做HA&#xff0c;实现真正的后端服务的HA。 要实现haproxy的HA&#xff0c;需要使用到keepalived&#xff0c;使用keepalived是VIP虚拟IP服务&#xff0…