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]<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问题详解及代码实现】已经结束。
之后应该会每天更新二道三题之前学过的算法专题,我们一起向前吧!
🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。
🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。
🌈诸君,山顶见!