Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。
🌈个人主页:主页链接
🌈算法专栏:专栏链接
我会一直往里填充内容哒!
🌈LeetCode专栏:专栏链接
目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出
🌈代码仓库:Gitee链接
🌈点击关注=收获更多优质内容🌈
本篇总结过去一周内遇到双指针问题。
双指针通用模板即为一个循环条件控制一个指针运动,循环体里以判断条件控制另一个指针前进。
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]
代码实现:
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问题详解及代码实现】已经结束。
之后应该会每天更新二道三题之前学过的算法专题,我们一起向前吧!
🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。
🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。
🌈诸君,山顶见!