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

左右指针

  • 前言
  • 一、双指针算法
  • 二、左右指针
    • 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;
}

总结

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

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

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

相关文章

八大算法排序@希尔排序(C语言版本)

目录 希尔排序概念算法思想示例分析结论算法步骤选择增量序列按增量分组逐步缩小增量 算法优势 代码实现核心算法希尔排序代码实现&#xff1a; 时间复杂度空间复杂度特性总结 该排序会关联到直接插入排序的知识点&#xff0c;如果对于直接插入排序还有所疑惑&#xff0c;可以跳…

Stable Diffusion模型概述

Stable Diffusion 1. Stable Diffusion能做什么&#xff1f;2. 扩散模型2.1 正向扩散2.2 反向扩散 3. 训练如何进行3.1 反向扩散3.2 Stable Diffusion模型3.3 潜在扩散模型3.4 变分自动编码器3.5 图像分辨率3.6 图像放大 4. 为什么潜在空间是可能的&#xff1f;4.1 在潜在空间中…

uniapp:签字版、绘画板 插件l-signature

官方网站&#xff1a;LimeUi - 多端uniapp组件库 使用步骤&#xff1a; 1、首先从插件市场将代码下载到项目 海报画板 - DCloud 插件市场 2、下载后&#xff0c;在项目中的uni_modules目录 3、最后 没有其它步骤&#xff0c;直接官网代码复制到vue文件中就可以了&#xff0c…

挑战 ChatGPT 和 Google Bard 的防御

到目前为止&#xff0c;科学家已经创建了基于人工智能的聊天机器人&#xff0c;可以帮助内容生成。我们还看到人工智能被用来创建像 WormGPT 这样的恶意软件&#xff0c;尽管地下社区对此并不满意。但现在正在创建聊天机器人&#xff0c;可以使用生成人工智能通过即时注入活动来…

stable diffusion 基础教程-文生图

置顶大模型插件资源链接 你如果没有魔法上网,请自取 百度云盘链接:链接:https://pan.baidu.com/s/1_xAu47XMdDNlA86ufXqAuQ?pwd=23wi 提取码:23wi 界面介绍 参数解释 参数解释Sampling method扩散去噪算法的采样模式,不同采样模式会带来不一样的效果steps模型生成图片的迭…

OpenCV-Python(24):模板匹配

原理及介绍 模板匹配是一种常用的图像处理技术&#xff0c;它用于在一幅图像中寻找与给定模板最匹配的区域(在一副大图中搜寻查找模版图像位置的方法)。模板匹配的基本思想是将模板图像在目标图像上滑动&#xff0c;并计算它们的相似度&#xff0c;找到相似度最高的位置即为匹配…

Docsify:一款便捷的文档生成工具

一、产品介绍 Docsify是一个简单、易用的文档生成工具。它允许用户使用Markdown编写文档&#xff0c;然后一键生成静态网站。这样&#xff0c;我可以方便地将我的知识库和项目文档分享给他人&#xff0c;同时还能保持文档的更新和完整性。 二、应用场景 非常适合个人知识库、…

Redis缓存与数据库如何保证一致性

数据库和缓存如何保证一致性&#xff1f; 目录 数据库和缓存如何保证一致性&#xff1f;背景方案先更新数据库&#xff0c;还是先更新缓存&#xff1f;先更新数据库&#xff0c;再更新缓存先更新缓存&#xff0c;再更新数据库 先更新数据库&#xff0c;还是先删除缓存&#xff…

代码随想录刷题笔记(DAY4)

今日总结&#xff1a;今天把中心放在前端学习上&#xff0c;最后一个题没有完全理解&#xff0c;明天早起补上吧。勉强算完成任务。&#xff08;已补上&#xff09; Day 4 01. 两两交换链表中的节点&#xff08;No. 24&#xff09; 题目链接 代码随想录题解 1.1 题目 给你…

Python高级用法:装饰器(decorator)

装饰器&#xff08;decorator&#xff09; Python装饰器的作用是使函数包装与方法包装&#xff08;一个函数&#xff0c;接受函数并返回其增强函数&#xff09;变得更容易阅读和理解。最初的使用场景是在方法定义的开头能够将其定义为类方法或静态方法。 不使用装饰器的代码如…

Cesium特效-2023年汇总

1-3dTiles建筑实现随机贴图 使用3dTiles的customShader接口&#xff0c;在前端实现不同白模建筑贴不同的图片 2-淡入淡出的扩散雷达效果 在扩散雷的基础上&#xff0c;实现渐隐渐现的效果 3-不规则多边形的扩散效果 指定一个中心点&#xff0c;改变每个多边形的顶点位置来实现动…

如何做一个炫酷的Github个人简介(3DContribution)

文章目录 前言3D-Contrib第一步第二步第三步第四步第五步第六步 前言 最近放假了&#xff0c;毕设目前也不太想做&#xff0c;先搞一点小玩意玩玩&#xff0c;让自己的github看起来好看点。也顺便学学这个action是怎么个事。 3D-Contrib 先给大家看一下效果 我的个人主页&am…

坐标转换 | EXCEL中批量将经纬度坐标(EPSG:4326)转换为墨卡托坐标(EPSG:3857)

1 需求 坐标系概念&#xff1a; 经纬度坐标&#xff08;EPSG:4326&#xff09;&#xff1a;WGS84坐标系&#xff08;World Geodetic System 1984&#xff09;是一种用于地球表面点的经纬度坐标系。它是美国国防部于1984年建立的&#xff0c;用于将全球地图上的点定位&#xff0…

普中STM32-PZ6806L开发板(HAL库函数实现-读取内部温度)

简介 主芯片STM32F103ZET6&#xff0c;读取内部温度其他知识 内部温度所在ADC通道 温度计算公式 V25跟Avg_Slope值 参考文档 stm32f103ze.pdf 电压计算公式 Vout Vref * (D / 2^n) 其中Vref代表参考电压&#xff0c; n为ADC的位数&#xff0c; D为ADC输入的数字信号。 实现…

Linux驱动学习—设备树及设备树下的platform总线

1、什么是设备树&#xff1f; 设备树是一种描述硬件资源的数据结构。他通过bootloader将硬件资源传给内核&#xff0c;使得内核和硬件资源 描述相对独立。 2、设备树的由来 2.1 平台总线的由来 要想了解为什么会有设备树&#xff0c;设备树是怎么来的&#xff0c;我们就要先…

网络安全—模拟IP代理隐藏身份

文章目录 网络拓扑安装使用代理服务器设置隐藏者设置 使用古老的ccproxy实现代理服务器&#xff0c;仅做实验用途&#xff0c;禁止做违法犯罪的事情&#xff0c;后果自负。 网络拓扑 均使用Windows Server 2003系统 Router 外网IP&#xff1a;使用NAT模式 IP DHCP自动分配或者…

提升软件质量与效率:UI自动化测试的重要性

在软件开发领域&#xff0c;UI自动化测试工具被广泛应用&#xff0c;其意义不仅仅体现在节省时间和资源上&#xff0c;更关系到软件质量的提升、团队效率的增加&#xff0c;以及用户体验的改善。本文将探讨使用UI自动化测试工具的重要性&#xff0c;以及它在软件开发生命周期中…

IDEA生成jar包

一、打开项目结构管理界面 英文版可以使用Ctrl Alt Shift S 打开 Project Structure 窗口 如下图 汉化idea 在设置中 tips&#xff1a;idea汉化包如果不能下载的话&#xff0c;可以手动下载安装 1、先确认自己安装的idea版本 2、来这里Chinese (Simplified) Language Pack…

一篇了解springboot3请求参数种类及接口测试

SpringBoot3数据请求&#xff1a; 原始数据请求&#xff1a; //原始方式RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParameter("name");String age request.getParame…

【备忘】今天写一下如何买免费证书

使用场景 使用微信支付宝支付转账时小游戏小程序接口开发时其它情况 开发中不可避免的会接触https&#xff0c;有的公司有运维去做这个事&#xff0c;有的是老板自己会搞https证书&#xff0c;咱多了解一项技术也是好事。 如何买证书 登录阿里云控制台&#xff0c;搜索ssl证…