【双指针问题】LeetCode:392、3、11问题详解及代码实现

简介: 本篇总结过去一周内遇到双指针问题。

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。


🌈个人主页:主页链接


🌈算法专栏:专栏链接


    我会一直往里填充内容哒!


🌈LeetCode专栏:专栏链接


  目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出


🌈代码仓库:Gitee链接


🌈点击关注=收获更多优质内容🌈


f6131b0f4c8e42728c63ece04a192ad1.jpg


本篇总结过去一周内遇到双指针问题。


双指针通用模板即为一个循环条件控制一个指针运动,循环体里以判断条件控制另一个指针前进。


Leetcode 392. 判断子序列str:


给定字符串 s 和 t ,判断 s 是否为 t 的子序列。


字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。


示例 1:


输入:s = "abc", t = "ahbgdc"

输出:true


示例 2:


输入:s = "axc", t = "ahbgdc"

输出:false


我们先来看看题目,题目大意就是看看s的三个字母是否在t中出现,若出现返回true,若无则返回false。


动图演示


6d50f7917b88400882c8387c4dd58536.gif


思路讲解


双指针通用模板即为一个循环条件控制一个指针运动,循环体里以判断条件控制另一个指针前进。


这题也是非常经典的模板题,虽然不能 但思想很重要.


代码实现:


class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.size() == 0)return 0;
        int n = s.size(),ans=0;
        int a[200]={0};
        int i = 0, j = 0;
        for (; j < n; j++)
        {
            a[s[j]]++;
            while (i < j && a[s[j]]>1)
            {
                a[s[i]]--;
                i++;
            }
            ans = max(ans, j - i + 1);
        }
        if (a[s[j - 1]] == 1)ans = max(ans, n - i);
        return ans;
    }
};


Leetcode 11. 盛最多水的容器:


给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。


找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。


返回容器可以储存的最大水量。


说明:你不能倾斜容器。


输入:[1,8,6,2,5,4,8,3,7]

输出:49

解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。


b53d26a7bdda443ca32bc0e32fcf7809.png


思路讲解:


令两个指针i=0,与j=n-1 也就是从容器的两端向中间移动。容器能容纳的面积为s=(j-i)*min(height[i],height[j])。得出的面积和在取max


所以有个思想就是 那边低就移动哪边,例如,i=0 j=7的时候,height[i]


代码实现:


class Solution {
public:
    int maxArea(vector<int>& height) {
        int s=0,n=height.size();
        int i=0,j=n-1,ans=0,min_long=0;
        while(i<j)
        {
            min_long=min(height[i],height[j]);
            s=min_long*(j-i);
            ans=max(ans,s);
            if(height[i]==min_long)i++;
            else j--;
        }
        return ans;
    }
};


Leetcode 633. 平方数之和:


给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。


示例 1:


输入:c = 5

输出:true

解释:1 * 1 + 2 * 2 = 5


示例 2:


输入:c = 3

输出:false


思路讲解:


与上题相同,同样是寻找边界的问题,所以我们还是一个左边界指针i,一个右边界指针j,j的取值为sqrt(c),因为j的类型为long,所以不会出现0^2+j^2=c的情况.


当a*a+b*b>c的时候 说明值太大了,所以移动b--.


当a*a+b*b


若当a*a+b*b==c的时候 因为之前的循环有移动a b 所以需要重新判断一下,a是否满足<=b这一关系.


若成立 则说明匹配成功


若当整个循环结束后都没有找到,则说明没有匹配项


注意这题若使用上面的判断则会出现数据溢出,因为数据类型大小超过了int,所以要采用代码写的a*a+b*b-c作为判断条件


代码实现:


class Solution {
public:
    bool judgeSquareSum(int c) {
        int a=0;
        long b=sqrt(c);
        while(a<=b)
        {   
            while(a*a+b*b-c>0)b--;
            while(a*a+b*b-c<0)a++;
            if(a<=b&&a*a+b*b-c==0)return true;
        }
        return false;
    }


完结撒花:


🌈本篇博客的内容【LeetCode:392、3、11问题详解及代码实现】已经结束。


    之后应该会每天更新二道三题之前学过的算法专题,我们一起向前吧!


🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。


🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。


🌈诸君,山顶见!


目录
相关文章
|
1天前
|
索引
力扣每日一题 6/17 枚举+双指针
力扣每日一题 6/17 枚举+双指针
5 1
|
10天前
|
Go C++
代码随想录——双指针/滑动窗口(二)
代码随想录——双指针/滑动窗口(二)
|
10天前
代码随想录——双指针(一)
代码随想录——双指针(一)
|
18天前
力扣-2029-石子游戏-‘屎山’代码
力扣-2029-石子游戏-‘屎山’代码
17 3
|
20天前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
|
20天前
|
算法 数据挖掘 Java
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
|
20天前
|
存储 算法 数据挖掘
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
|
10天前
|
Go C++
代码随想录——双指针与滑动窗口(四)
代码随想录——双指针与滑动窗口(四)
|
10天前
|
Go C++
代码随想录——双指针/滑动窗口(三)
代码随想录——双指针/滑动窗口(三)
|
16天前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表