two pointers是算法编程中一种非常重要的思想,但是很少会有教材单独拿出来将,其中一个原因是它更倾向于是一种编程技巧,而长得不太像是一个是“算法”的模样。two pointers的思想十分简介,但却提供了非常高的算法效率。

  以一个例子引入:给定一个递增的正整数序列和一个正整数M,求序列中的连个个不同位置的数a和b,使得它们的和恰好为M,输出所有满足条件的方案。例如给定序列{1,2,3,4,5,6}和正整数M=8,就存在2+6=8和3+5=8成立。

  本题的一个最直观的想法是:暴力求解,使用二重循环枚举序列中的整数a和b,判断它们的和是不是M,如果是,输出方案,如果不是,则继续枚举。代码如下:

for(int i = ;i < n; i ++){
for(int j = i+; j < n; j++){
if(a[i]+a[j]==M){
cout<<a[i]<<" "<<a[j]<<endl;
}
}
}

  显然,这样做的时间复杂度是O(n^2),对n在10^5的规模时是不可承受的。

  那么根据two pointers的思想,代码如下:

  

while(i<j){
if(a[i]+a[j]==M){
cout<<a[i]<<" "<<a[j]<<endl;
i++;
j--;
}else if(a[i]+a[j]<M){
i++;
}else{
j--;
}
}

 明显,此方法的时间复杂度为O(n),可以发现,two poin的思想慧聪分利用了递增序列的性质,以很浅显的思想降低了复杂度。

最新文章

  1. 记录vmware虚拟机安装的时候一些注意
  2. 使用 UICollectionView 实现日历签到功能
  3. TJI读书笔记15-持有对象
  4. git学习 git-flow
  5. C#连接数据库的四种方法
  6. VIM进阶学习之几种模式和按键映射
  7. notepad++使用技巧及插件汇总
  8. 微信公众平台开发(57)Emoji表情符号
  9. 异步非阻塞IO的Python Web框架--Tornado
  10. 不要浪费人生的每一天 ——Dropbox创始人在麻省理工的演讲 z
  11. iOS单例的两种实现
  12. boost::asio译文
  13. linux mail命令详解
  14. 一起学习java
  15. FTP连接池
  16. hdu 3374 String Problem(kmp+最小表示法)
  17. Focal Loss理解
  18. OP社区相关
  19. react组件父传子
  20. winSockets编程(三)最简单的C/S形式

热门文章

  1. Spring教程笔记(2) IOC
  2. 简易OA漫谈之工作流设计(五,直接上级)
  3. TCP建立连接三次握手和释放连接四次握手
  4. thinkphp5 图片下载保存
  5. 帝国cms中当调用当前信息不足时,继续取其他数据
  6. math-2人博弈
  7. Vultr新用户充值优惠 – 最多充值100美元送100美元
  8. pgmpy安装
  9. Python收发邮件
  10. 对弈的C++学习笔记