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

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

 

🌈个人主页:主页链接

🌈算法专栏:专栏链接

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

🌈LeetCode专栏:专栏链接 

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

🌈代码仓库:Gitee链接

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

 

目录

Leetcode 392. 判断子序列str:

动图演示

思路讲解

代码实现:

Leetcode 11. 盛最多水的容器:

思路讲解:

代码实现:

 Leetcode 633. 平方数之和:

思路讲解:

代码实现:

完结撒花:


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

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

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。

动图演示

 

思路讲解

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

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

代码实现:

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。

思路讲解:

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

所以有个思想就是 那边低就移动哪边,例如,i=0 j=7的时候,height[i]<height[j],此时移动小的那边,也就是移动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<c的时候 说明值太小了,所以移动a++.

若当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问题详解及代码实现】已经结束。

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

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

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

🌈诸君,山顶见!

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ppeua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值