算法修炼之路之双指针含多道leetcode 经典题目

这篇具有很好参考价值的文章主要介绍了算法修炼之路之双指针含多道leetcode 经典题目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言 

一:普通双指针

1.经典题目一  283移动0问题

分析

代码实现

2.经典题目二 1089复写0 

分析

代码实现

二:解决成环类问题-快慢指针 

经典例题一 202快乐数

分析 

代码实现 

 三:左右相遇指针

经典例题一 11 盛最多水的容器

分析 

代码实现 

 


算法修炼之路之双指针含多道leetcode 经典题目,经典算法,算法

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧

前言 

在解决关于数组的问题时,常常用到双指针的解决方法来优化算法,帮助解决问题,常见的双指针分为普通双指针,快慢指针,左右相遇指针等

一:普通双指针

普通双指针就是解决普通问题,一般是在原数组上改动数据时,有从前向后,从后向前,都从前向后,都从后向前,对数组分块来解决问题等

1.经典题目一  283移动0问题

算法修炼之路之双指针含多道leetcode 经典题目,经典算法,算法

分析

 算法修炼之路之双指针含多道leetcode 经典题目,经典算法,算法

代码实现
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        //双指针方法
        int cur=0,dest=-1;
        int n=nums.size();
        while(cur<n)
        {
            if(nums[cur]==0)
            {
                ++cur;
            }
            else
            {
                swap(nums[++dest],nums[cur++]);
            }
        }
    }
};

2.经典题目二 1089复写0 

算法修炼之路之双指针含多道leetcode 经典题目,经典算法,算法

分析

算法修炼之路之双指针含多道leetcode 经典题目,经典算法,算法 

代码实现

 

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur=0,dest=-1;
        int n=arr.size();
        //求最后一个要复写的数据
        while(cur<n)
        {
            if(arr[cur])//不为0走一步
            {
                ++dest;
            }
            else//为0走两步
            {
                dest+=2;
            }
            if(dest>=n-1) break;//边界问题防止越界访问
            ++cur;
        }

        //处理边界问题
        if(dest==n)
        {
            arr[n-1]=0;
            dest-=2;
            cur-=1;
        }

        //再从后往前复写数据
        while(cur>=0)
        {
            if(arr[cur])
            {
                arr[dest--]=arr[cur--];
            }
            else
            {
                arr[dest--]=0;
                arr[dest--]=0;
                --cur;
            }
        }
    }
};

二:解决成环类问题-快慢指针 

在解决一些关于数组或者链表成环类问题时常常用到的是快慢指针,就是slow指针走一步,fast指针一次走两步,常常用相遇来解决问题

经典例题一 202快乐数

算法修炼之路之双指针含多道leetcode 经典题目,经典算法,算法

分析 

算法修炼之路之双指针含多道leetcode 经典题目,经典算法,算法

代码实现 
class Solution {
public:
    int bitSum(int n)//计算n的平方和
    {
        int sum=0;
        while(n)
        {
            int tmp=n%10;
            sum+=tmp*tmp;
            n/=10;
        }
        return sum;
    }
    bool isHappy(int n) {
        int slow=n,fast=bitSum(n);//slow为第一个位置,fast为第二个位置
        while(slow!=fast)//走到直至相遇
        {
            slow=bitSum(slow);
            fast=bitSum(bitSum(fast));
        }
        if(slow==1)//是1的话则是快乐数
        {
            return true;
        }
        return false;
    }
};

 三:左右相遇指针

说明一下,左右相遇指针是自己理解取的名字,意思就是这类题定义的双指针得从两端向中间走,直至相遇

经典例题一 11 盛最多水的容器

算法修炼之路之双指针含多道leetcode 经典题目,经典算法,算法

分析 

对于这道题大多人首先想到的是暴力求解,求出每两个数据之间的容量,在求出最大的一个

但这样的话对于这道题,这样做的话会超出时间限制的,因此得采取其他方法

算法修炼之路之双指针含多道leetcode 经典题目,经典算法,算法文章来源地址https://www.toymoban.com/news/detail-850214.html

代码实现 
class Solution {
public:
    int maxArea(vector<int>& height) {
        int left=0,right=height.size()-1;//左右双指针
        int ret=0;
        while(left<right)
        {
            int v=min(height[left],height[right])*(right-left);//算出数据
            ret=max(ret,v);//求出最大的一个数据,存放在ret中

            //移动指针
            if(height[left]<height[right])
            {
                ++left;
            }
            else
            {
                --right;
            }
        }
        return ret;
    }
};
 

到了这里,关于算法修炼之路之双指针含多道leetcode 经典题目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法之双指针题型:

    力扣27: 移除元素 力扣题目链接 双指针分为: 快慢双指针:同一个起点,同向出发 相向双指针:从两端出发,方向相反,终会相遇 经典的双指针(快慢双指针) 代码随想录上面有动图,很清楚 思路: 力扣977: 有序数组的平方 力扣题目链接 也是双指针法(相向指针) 如

    2024年02月09日
    浏览(38)
  • c++算法之双指针

    目录 双指针简介 对撞指针 求解步骤 例题 蓝桥oj1371回文判定 题目描述 输入描述 输出描述 输入输出样例 示例 1 示例 2 运行限制 解 快慢指针 求解步骤 例题 蓝桥oj1372美丽的区间 题目描述 输入描述 输出描述 输入输出样例 示例 1 运行限制 解 例题 蓝桥oj 1621挑选字串 题目描述

    2024年01月20日
    浏览(32)
  • 力扣编程题算法初阶之双指针算法+代码分析

    目录   第一题:复写零 第二题:快乐数: 第三题:盛水最多的容器 第四题:有效三角形的个数   力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路: 上期介绍到双指针,这次来用双指针实际操作。第一种从前往后复写,会导致为复写的数字被覆盖,因此选择从后往

    2024年02月04日
    浏览(31)
  • LeetCode | 一探环形链表的奥秘【快慢双指针妙解BAT等大厂经典算法题】

    前言 本文总结了力扣141.环形链表|以及142.环形链表||这两道有关环形链表的求解方案,去求证链表是否带环已经如何找出入环口的结点。 有关环形链表,在BAT等大厂面试中均有出现,一般是属于 中等难度 的题,需掌握 原题传送门 给你一个链表的头节点 head ,判断链表中是

    2024年02月01日
    浏览(34)
  • 【双指针】经典数组双指针题LeetCode

    27. 移除元素 简单 题目链接 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间, 你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的

    2024年02月12日
    浏览(29)
  • 【leetcode刷题之路】面试经典150题(8)——位运算+数学+一维动态规划+多维动态规划

    20 位运算 20.1 【位运算】二进制求和 题目地址:https://leetcode.cn/problems/add-binary/description/?envType=study-plan-v2envId=top-interview-150   按位逆序运算。 20.2 【位运算】颠倒二进制位 题目地址:https://leetcode.cn/problems/reverse-bits/description/?envType=study-plan-v2envId=top-interview-150   详见代码

    2024年04月16日
    浏览(61)
  • 【数据结构与算法】之多指针算法经典问题

    本文为 【数据结构与算法】多指针算法经典问题 相关介绍,下边将对 链表反转 (包含 迭代反转链表 、 递归反转 、 头插法反转 ), 双指针-快慢指针 (包含 寻找单向无环链表的中点 、 判断单向链表是否有环及找环入口 ), 双指针-左右指针 (包含 两数之和 、 二分查

    2024年02月03日
    浏览(31)
  • 复现经典目标跟踪算法ByteTrack之路:调通第一个demo

    ByteTrack源论文地址:https://arxiv.org/pdf/2110.06864.pdf ByteTrack开源代码地址:https://github.com/ifzhang/ByteTrack 本文在官方给出的配置指南编写,提供了许多避坑方式。 可直接使用Git clone到本地 也可以使用pycharm自带的方式直接将代码clone下来。 写在前面:为了不引起各种版本不适配导

    2024年04月09日
    浏览(31)
  • 【经典算法】双指针(尺取法):爱,是双向奔赴,还是你追我赶?

    👑专栏内容:算法学习随笔 ⛪个人主页:子夜的星的主页 💕座右铭:日拱一卒,功不唐捐 双指针法又称尺取法,顾名思义, 在区间操作时,使用两个指针同时遍历区间,从而实现高效操作。 两个指针,就像是一男一女,他们遍历区间的过程,又何尝不像是一对男女彼此

    2024年01月23日
    浏览(34)
  • leetcode经典算法——快速幂

    实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 暴力方法肯定是循环循环n次, 每一次*x 显然此方法遇到大的数字会超时 那么我们要引进一个思想, 快速幂算法 例如: x^97 我们可以看出,从右向左 每当n为奇数时,就会多乘一次x 例如:x 97 = x 48 * x 48 * x; 当n为偶数时

    2024年02月13日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包