码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 专题一:双指针【优选算法】


    双指针应用场景:

    数组划分、数组分块

     

    目录

     

    一、移动0

     二、复写0 从后向前

      三、快乐数 链表带环

     四、盛水最多的容器 单调性+双指针

    五、有效三角形个数 单调性+双指针

     六、和为s的两个数字

    七、三数之和 细节多 需再练


    一、移动0

    1. class Solution {
    2. public:
    3. void moveZeroes(vector<int>& nums) {
    4. int dest = -1;
    5. for(int cur = 0;cur < nums.size();cur++){
    6. if(nums[cur])
    7. {
    8. swap(nums[++dest],nums[cur]);
    9. }
    10. }
    11. }
    12. };

     二、复写0 从后向前

    c

    细节:当最后cur = 0时,要小心越界。

    1. class Solution {
    2. public:
    3. void duplicateZeros(vector<int>& arr) {
    4. int cur = 0,dest = -1;
    5. int n = arr.size();
    6. while(cur < arr.size())
    7. {
    8. if(arr[cur]) dest++;
    9. else dest += 2;
    10. if(dest >= n-1) break;
    11. cur++;
    12. }
    13. if(dest == n)
    14. {
    15. arr[n - 1] = 0;
    16. cur--;
    17. dest -= 2;
    18. }
    19. while(cur >= 0)
    20. {
    21. if(arr[cur]) arr[dest--] = arr[cur--];
    22. else
    23. {
    24. arr[dest--] = 0;
    25. arr[dest--] = 0;
    26. cur--;
    27. }
    28. }
    29. }
    30. };

      三、快乐数 链表带环

    1. class Solution {
    2. public:
    3. int bitSum(int n)
    4. {
    5. int ret = 0;
    6. while(n>0)
    7. {
    8. ret += (n%10)*(n%10);
    9. n /= 10;
    10. }
    11. return ret;
    12. }
    13. bool isHappy(int n) {
    14. int slow = n, fast = bitSum(n);
    15. while(slow != fast)
    16. {
    17. slow = bitSum(slow);
    18. fast = bitSum(bitSum(fast));
    19. }
    20. return slow == 1;
    21. }
    22. };

     四、盛水最多的容器 单调性+双指针

    注意:高度由矮的决定。

    1. class Solution {
    2. public:
    3. int maxArea(vector<int>& height) {
    4. int n = height.size();
    5. int left = 0,right = n-1;
    6. int ret = 0;
    7. while(left < right){
    8. int v = min(height[left],height[right])*(right-left);
    9. ret = max(ret,v);
    10. if(height[left] < height[right]) left++;
    11. else right--;
    12. }
    13. return ret;
    14. }
    15. };

    五、有效三角形个数 单调性+双指针

    核心:两小边之和大于第三边就可以组成三角形。

     

    1. class Solution {
    2. public:
    3. int triangleNumber(vector<int>& nums) {
    4. sort(nums.begin(),nums.end());
    5. int count = 0;
    6. for(int m = nums.size()-1;m >= 0;m--){
    7. int l = 0,r = m-1;
    8. while(l < r)
    9. {
    10. if(nums[l] + nums[r] > nums[m]) count += (r-l),r--;
    11. else l++;
    12. }
    13. }
    14. return count;
    15. }
    16. };

     六、和为s的两个数字

    出现上面这样的报错是因为编译器觉得可能没有返回值,最后随便返回一个就行。 

    七、三数之和 细节多 需再练

    注意:要避免越界。 

    1. class Solution {
    2. public:
    3. vectorint>> threeSum(vector<int>& nums) {
    4. int n = nums.size();
    5. sort(nums.begin(),nums.end());
    6. vectorint>> ret;
    7. int i = 0;
    8. while(i < n){
    9. if(nums[i] > 0)break;
    10. int left = i+1,right = n-1,target = -nums[i];
    11. while(left < right)
    12. {
    13. int sum = nums[left]+nums[right];
    14. if(sum < target) left++;
    15. else if(sum > target) right--;
    16. else
    17. {
    18. ret.push_back({nums[i],nums[left],nums[right]});
    19. left++,right--;
    20. while(left < right && nums[left] == nums[left-1]) left++;
    21. while(left < right && nums[right] == nums[right+1]) right--;
    22. }
    23. }
    24. i++;
    25. while(i < n && nums[i] == nums[i-1]) i++;
    26. }
    27. return ret;
    28. }
    29. };

  • 相关阅读:
    Cheerleaders UVA - 11806
    Linux系统:基本命令
    【Typescript】面向对象(上篇),包含类,构造函数,继承,super,抽象类
    Linux之VFS之美
    如何通过Photoshop将视频转换成GIF图片
    883. 三维形体投影面积
    ctfshow web41-web50
    深入解析PHP框架:Symfony框架详解与应用
    基于企鹅优化算法的机器人轨迹规划(Matlab代码实现)
    命令执行漏洞
  • 原文地址:https://blog.csdn.net/m0_73065213/article/details/133580059
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号