刚刚在刷题的时候接触到了一道题,题的大意是给出一个递增的数字序列,并给出一个m,要求找到a,b两个数字,且和为m,并且a<b;
在示例中,给出了三种思路,二分、hash值、以及two pointers;
最后一种并没有接触过,所以去了解了一下,发现是很值得借鉴的思路;

two pointers思想是对有序数组的优化遍历;
如果根据题目中的思想,进行两层枚举,则不可避免地会使时间复杂度到达O(n^2)级别。但是可以针对序列递增这一条进行优化;
对这个有序序列,设定两个索引坐标,一个为i,一个为j分别从队头和队尾进行向中间枚举,枚举的边界条件是i<j;
在枚举过程中,必定会出现三种情况:
在此时注意一个前提条件:i必须保持增加状态,j必须保持减小状态;
1.a+b=m,此时是我们想得到的情况,并且该情况发生时,如果i增大,j减小,则a+b可能和不变;
2.a+b>m,此时,在前提条件规范下,我们可以推断如果b减小,也就是j减小,可以预测会出现a+b=m的情况;
3.a+b<m,此时,在前提条件规范下,我们可以推断,如果a增大,也就是i增大,可能会出出现a+b=m的情况;
因此,将上述判别写成代码可以有以下结果:

while(i<j){if(a[i]+a[j]==m){i++;j--;}else if(a[i]+a[j]<m){i++;}else{j--;}}

这种方法可以看成是一种取巧的方法,但是其最大的特点是有效的减少了时间复杂度,在递增序列的前提下,循环只需要进行到i>=j时停止,所以理想状态下只需要遍历半个序列,时间复杂度只需要O(n),所以算得上求解的一种好方法;

关于Two pointers的个人理解相关推荐

  1. LeetCode42题,单调栈、构造法、two pointers,这道Hard题的解法这么多?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第23篇文章. 今天来看一道很有意思的题,它的难度是Hard,并且有许多种解法. 首先我们来看题面,说是我们有若 ...

  2. 理解Pointers In C++:第一重

    Variable vs. Pointer int foo; int *foo_ptr = &foo; Grammatrically speaking, there is no such thi ...

  3. pytorch lstm crf 代码理解 重点

    好久没有写博客了,这一次就将最近看的pytorch 教程中的lstm+crf的一些心得与困惑记录下来. 原文 PyTorch Tutorials 参考了很多其他大神的博客,https://blog.c ...

  4. pytorch lstm crf 代码理解

    好久没有写博客了,这一次就将最近看的pytorch 教程中的lstm+crf的一些心得与困惑记录下来. 原文 PyTorch Tutorials 参考了很多其他大神的博客,https://blog.c ...

  5. 深入理解 wpa_supplicant(四)

    本文为<深入理解Android Wi-Fi.NFC和GPS卷>读书笔记,Android源码为Android 5.1 android-5.1/external/wpa_supplicant_ ...

  6. 深入理解 wpa_supplicant(三)

    本文为<深入理解Android Wi-Fi.NFC和GPS卷>读书笔记,Android源码为Android 5.1 android-5.1/external/wpa_supplicant_ ...

  7. 深入理解 wpa_supplicant(一)

    本文为<深入理解Android Wi-Fi.NFC和GPS卷>读书笔记,Android源码为Android 5.1 wpa_supplicant 是一个开源软件项目,它实现了 Statio ...

  8. rust 案例_理解Rust的引用与借用

    困惑 接触Rust也一段时间了,但对References(引用) .borrowing(借用) . &关键字.ref关键字.* 关键字,这几个词非常困惑.常见的问题不在乎下面几条: & ...

  9. 如何理解c和c ++的复杂类型声明 (转)

    原文转自:http://blog.csdn.net/angle_birds/article/details/8991802 本文关键字:右左法则 右左法则:首先从最里面的圆括号看起,然后往右看,再往左 ...

最新文章

  1. Symfony2CookBook:如何创建自定义的表单域类型
  2. typecast java_Java中的类型转换
  3. 数字图像处理与Python实现笔记之图像特征提取
  4. 彻底解决_OBJC_CLASS_$_某文件名, referenced from:问题
  5. jquery监听窗口大小改变事件jquery.resizeend
  6. Bootstrap 表格的可选样式
  7. firewalld配置与使用
  8. 如何避免点击事件连续操作时元素变蓝
  9. 1.2 文本表示——Emdedding
  10. [Other] Inno Setup 使用心德-一个完整的项目 包括.NET组建捆绑 去空格等
  11. 5E7月3号服务器在维护,5E对战平台西南服务器上线!全新S2赛季即将开启
  12. GIGO1.1数据清洗利器,文献计量同义词合并
  13. 基于车牌形状和颜色的车牌定位
  14. 分析google关键词de工具
  15. linux增加预读缓存区大小,Linux blockdev命令设置文件预读大小介绍
  16. IE浏览器里面链接点击在Chrome浏览器打开
  17. 《C语言》罗马数字问题
  18. 常见的八种典型知识变现场景
  19. python固定效应模型_熊猫或stats模型的固定效应
  20. 你是外包,麻烦不要偷吃零食,注意素质..

热门文章

  1. 写给正在入坑linux系统的伙伴
  2. 【Mysql 学习路线图】
  3. 【转】linux之pmap命令!
  4. JavaScript 同源策略
  5. Windows核心编程 第八章 用户方式中线程的同步(上)
  6. POJ1376简单广搜
  7. hdu3986 spfa + 枚举最短路上的边
  8. C语言-运算符优先级及注意事项
  9. 【Android 插件化】VirtualAppEx 编译运行 ( VirtualAppEx 简介 | 配置 VirtualAppEx 编译环境 | 编译运行 VirtualAppEx 代码 )
  10. 【计算机网络】HTTP 与 HTTPS ( HTTPS 简介 | HTTP 通信过程 )