双指针刷题(二)
2023-12-31 12:49:15
所有算法文章链接(最底部)
目录
1.快乐数
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
分析题意
把一个正整数n的每一位都平方后相加,一直重复这个过程,在这个过程中如果出现1,说明这个数是快乐的,如果没出现就会陷入循环。
如过n =?2 就会陷入循环,2就不是快乐数。
解题思路
这道题无非就是两种情况,第一种是能出现1,第二种是没出现1陷入循环。
我们可以把这两种情况抽象成一种情况,两种情况都会进入循环,只不过第一种情况进入的都是1的循环中。
可以采用快慢指针的方法,快指针一次走2步,慢指针一次走一不。
不管哪种情况,快慢指针都会进入环中,而且一定会相遇,我们只需要判断相遇之后,位置是不是1就好了。
代码实现
class Solution {
public:
int getnum(int n){ //进行一步运算
int ret = 0;
while(n){
int tmp = n%10;
ret += tmp*tmp;
n/=10;
}
return ret;
}
bool isHappy(int n) {
int fast = getnum(n),slow = n;
while(fast != slow){//快慢指针相遇就终止
fast = getnum(getnum(fast));//块指针走两步
slow = getnum(slow);//慢指针走一步
}
if(fast== 1){//判断快慢指针相遇后是否为1
return true;
}
return false;
}
};
2.盛最多水的容器
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
分析题意
有一个存储板子的高度的数组,这些板子是可以切换的,问这些板子和x轴围成的容器,最大的容积是多少。
解题思路
这道题是一个非常明显的双指针算法,两个指针指向两块板子
维护一个容积的最大值
这两个指针,那个指针指向的板子高度低,哪个向中间移动,因为向中间移动,x轴会变短,容积会减小,向中间移动长板子的指针,容积要么减小要么不变,移动指向短板子的指针,容积要么不变要么变大。
代码实现
class Solution {
public:
int maxArea(vector<int>& height) {
int l = 0, r = height.size()-1;
int maxcap = 0;//最大容积
while(l < r){//两个板子相遇就终止
int len = r-l;
int minheight = min(height[l],height[r]);//找到两个板子最小的高度
maxcap = max(maxcap,len * minheight);//维护最大容积
if(height[l] < height[r]) l++;//哪个板子短,哪个向中间移动
else r--;
}
return maxcap;
}
};
文章来源:https://blog.csdn.net/W2155/article/details/135313368
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!