【双指针问题】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月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
1月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
1月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
3月前
|
存储 大数据 测试技术
掌握 GoLang 中的指针:高效代码的提示和技巧
掌握 GoLang 中的指针:高效代码的提示和技巧
|
3月前
|
Python
【Leetcode刷题Python】138. 复制带随机指针的链表
LeetCode上题目“138. 复制带随机指针的链表”的Python解决方案,包括两种方法:一种是在每个节点后复制一个新节点然后再分离出来形成新链表;另一种是构建一个字典来跟踪原始节点与其副本之间的映射关系,从而处理新链表的构建。
20 1
|
5月前
|
索引
力扣每日一题 6/17 枚举+双指针
力扣每日一题 6/17 枚举+双指针
33 1
|
5月前
|
Go C++
代码随想录——双指针/滑动窗口(二)
代码随想录——双指针/滑动窗口(二)
|
5月前
代码随想录——双指针(一)
代码随想录——双指针(一)
|
5月前
|
Go C++
代码随想录——双指针与滑动窗口(四)
代码随想录——双指针与滑动窗口(四)