「双指针」算法简析

news/2023/6/6 23:43:56

文章目录

    • 前言
    • 一、应用双指针算法的题型分类
      • 1. 两个序列
      • 2. 一个序列(常用)
    • 二、双指针算法代码模板
      • 模板剖析
    • 三、双指针算法的作用
    • 四、双指针算法思路
    • 五、例题
      • 1. 两个指针指向同一个序列
        • 1)两指针维护的不是一段区间
        • 2)两指针维护的是一段区间
          • 源码剖析
      • 2. 两指针分别指向不同的序列
          • 源码剖析
    • 六、课后习题

前言

            今天算法内容是 双指针算法

一、应用双指针算法的题型分类

1. 两个序列

共两个指针,一个指针指向一个序列,另一个指针指向另外一个序列。

2. 一个序列(常用)

两个指针指向同一个序列,两指针维护的是一段区间。

二、双指针算法代码模板

for (int i = 0, j = 0; i < n; i ++)  	//(1)
{//(2)while (j < i && check(i, j)) j ++;	//(3)//(4)
}

模板剖析

  • (1)i0开始,j可能从某一点开始,i扫描一遍整个序列;
  • (2)每次i更新完之后更新j
  • (3)需要判断j的范围所在范围的合法性,并且ij需要满足某种性质,如果满足某种性质j ++
  • (4)每道题目的具体逻辑;

三、双指针算法的作用

1)两个指针,如果用暴力写法两个指针共有 n2 种组合,算法时间复杂度为 O(n2)。

2)双指针算法通过运用某种性质,将暴力枚举所有情况的算法 O(n2) 的时间复杂度优化为 O(n)。

3)所有双指针算法的时间复杂度都为 O(n)。两个指针扫描一个序列,每个指针在所有循环里总共移动的次数不超过 n,两个指针总共移动的次数不超过 2n,故时间复杂度为 O(n)。

四、双指针算法思路

1)先想暴力枚举所有情况的做法;

2)双指针算法的本质是通过找两个指针单调性的性质来对暴力算法进行优化;

五、例题

1. 两个指针指向同一个序列

1)两指针维护的不是一段区间

LeetCode 167. 两数之和 II - 输入有序数组 原题链接

// 暴力做法:超时
class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {// 暴力解法vector<int> res;int n = numbers.size();for (int i = 0; i < n; i ++)  // i为终点{for (int j = 0; j < i; j ++)  // j为起点{if (numbers[i] + numbers[j] == target) {res.push_back(j + 1);res.push_back(i +1);return res;}}}return {};}
};
// 双指针算法进行优化
class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {// 优化int n = numbers.size();vector<int> res;for(int i = 0, j = n - 1; i < n; i ++){while (j > i && numbers[i] + numbers[j] > target) j --;if (numbers[i] + numbers[j] == target) {res.push_back(i + 1);res.push_back(j + 1);return res;}}return {};}
};

2)两指针维护的是一段区间

LeetCode 485. 最大连续1的个数 原题链接

源码剖析
class Solution {
public:int findMaxConsecutiveOnes(vector<int>& nums) {int n = nums.size();  						//(1)int res = 0;  								//(2)for (int i = 0, j = 0; i < n; i ++)  		//(3){while (j <= i && nums[i] != 1) j ++;  	//(4)res = max(res, i - j + 1);				//(5)//(6)}return res;}
};
  • (1) n 为整个数组的长度;
  • (2)res 为答案;
  • (3)定义ij两个指针,维护[j, i]这段区间,其中i为区间右端点,j为区间左端点,判断这段区间中是否存在连续1
  • (4) 检查[j,i]这段区间中是否为连续1。如果区间为连续的1,更新答案长度,且i继续往前走。如果区间中不为连续的1,则[j,i]这段区间不能作为答案,更新j指针,j可放心往前走,直到ji重合,j继续往前走一格,指向下一个元素将区间中的0这个元素去掉,j指针停止。
  • (5)更新答案 res
  • (6)走for循环中的 i++,直到i指针走到区间末尾;

2. 两指针分别指向不同的序列

LeetCode 88. 合并两个有序数组 原题链接

源码剖析
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int i = m - 1, j = n - 1;				 //(1)for (int k = m + n - 1; k >= 0; k --) {  //(2)if (j < 0 || (i >= 0 && nums1[i] >= nums2[j])) nums1[k] = nums1[i --];//(3)else nums1[k] = nums2[j --];		//(4)}}
};
  • (1)两个递增排序的数组 nums1nums2,元素数量分别是mn
  • (2)将两个数组合并后的结果放到nums1中,从num1末尾开始放;
  • (3)/(4)两个数组元素分别从后往前依次比较大小,将较大的元素放到nums1中,顺序为从后往前;

六、课后习题

习题1:LeetCode 209. 长度最小的子数组 原题链接
习题2:LeetCode 11. 盛最多水的容器 原题链接

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

手机计算机上输入错误是什么意思,电脑输入验证码总是提示错误该怎么解决?...

不少同学都遇到过在页面中输入验证码总是错误的问题&#xff0c;并且不管更换几次验证码图片&#xff0c;依然提示验证码错误&#xff0c;着实影响心情&#xff0c;接下来小编总结了一部分造成验证码总是错误的原因以及解决办法&#xff0c;希望对大家有所帮助;第一种&#xff…

织梦后台login.php不显示验证码,解决(织梦)dedecms后台登录验证码显示不出来 电脑维修技术网...

php未开启gd库一般来说&#xff0c;很少有服务器不开启gd库的&#xff0c;只有个别自己配置的主机环境可能未做过设置。检查PHP是否开启GD库代码if(!function_exists(gd_info))echo "不支持GD库";elseecho "支持";?>把以上代码保存到一个php文件中&…

ajax 验证码 控件,jQuery验证码插件:jquery.idycode.js

对于任何一个又评论功能的网站来说&#xff0c;验证码都是重中之重。没有验证码的话&#xff0c;用户就可以肆意刷评论&#xff0c;甚至是通过一些工具来操作&#xff0c;会对网络环境产生极大的危害。验证码这个词最早是在2002年由卡内基梅隆大学的路易斯冯安、Manuel Blum、N…

Web中验证码kaptcha

录目 一.首先导入kaptcha的jar 二.在web.xml文件中配置kaptcha 三.在HTML中创建一个img 四.启动tomcat即可显示 总结 一.首先导入kaptcha的jar https://pan.baidu.com/s/1CLw01glluEIEFcz_5t9cKw 提取码&#xff1a;o1kxkaptcha的jar 二.在web.xml文件中配置kaptcha &l…

SecureCRT利用Python脚本自动登陆服务器,自动验证Google Authenticator动态验证码

背景 本地连接远端的服务器&#xff0c;SecureCRT可以说是一大利器&#xff0c;可以保存密码、设置自动登陆等&#xff0c;每次都可以一键直连服务器 最近因公司加强了服务器登陆验证&#xff0c;增加了二次认证&#xff0c;必须用Google Authenticator输入6位动态验证码&…

eclipse java验证码_spring整合kaptcha验证码

前言&#xff1a;验证码在项目肯定会用得到&#xff0c;本案例是在window上运行的&#xff0c;若kaptcha验证码在Linux上显示的是一堆乱码&#xff0c;可能是因为Linux没有中文字体库和中文字体造成的&#xff0c;可进行如下操作&#xff1a;欢迎大家关注我的公众号 javawebkf&…

服务器做验证码,短信验证码_02.搭建服务器环境

Node 搭建服务器环境1.在项目下新建一个文件夹 sms-send,并用编辑器打开2.用终端进入 sms-send 文件夹路径2.1.自动创建 package.json命令&#xff1a;npm init --yes 创建好之后就这个样子:2.2. 装对应的模块npm install express body-parser request querystring --save3.创建…

中微子电池(Neutrinovoltaic)是能源发展的新载体

(Xinwengao.com) Neutrinovoltaic是能源技术领域的一个新术语。 这是一项创新的技术&#xff0c;中微子石墨烯纳米硅电池&#xff0c;该技术可以从不可见辐射光谱的电磁辐射中接收能量&#xff0c;转化为电力。 Neutrinovoltaic 一词的第一部分定义了“中微子”的概念。 中微…