目录
202.快乐数
题目解析:
算法解析:
代码:
11.盛最多水的容器
题目解析:
算法解析:
代码:
202.快乐数
力扣链接:202.快乐数
题目解析:
本文中最重要的一句话就是重复平方和过程直到数字变为1,也可能是无限循环始终不变1.
这里我们可以画出示例图来分析。
我们最终可以发现只有两种情况,要么内部循环都为1,要么内部循环不为1.而二者共同点就在于一定会循环~
算法解析:
这里我们还是可以使用双指针的解法——快慢指针~相信大家不会陌生,快慢指针通过慢走一步快走两步的特点可以很快判断出来是否成环(即循环)。而本题我们不需要验证是否循环,只需要在快慢指针相遇的时候(无限循环中)判断环中数字是否为1即可~
代码:
class Solution {
public://处理平方和int sumsum(int n){int sum = 0;while (n){int a = n % 10;sum += a * a;n /= 10;}return sum;}bool isHappy(int n) {//初始化优先错开int slow = n;int fast = sumsum(n);//快慢指针相遇while (fast != slow){slow = sumsum(slow);fast = sumsum(sumsum(fast));}return slow == 1;}
};
11.盛最多水的容器
11. 盛最多水的容器 - 力扣(LeetCode)
题目解析:
通过示例图可以我们看出基本计算为:选择的下标相减 X 两数间最小数
算法解析:
我们先划出一个小范围,然后尝试在该范围里面选出最大容量。我们优先选取两端数,这样可以保证长度是最长的,然后我们再尝试缩短范围(拿宽短的尝试比较),这样我们可以得出两种结果:
要么是 长度和宽度都减小了(2---4),要么是长度减小宽度不变(5--4).最终的容量都不如最开始v1(6--4)的大,因此我们可以直接排除4,因为在后续的比较中毫无意义。
当我们知道规律后就很简单了,列出双指针指向两端。记录每一次所指向的两个数对应的容量,然后两数谁小谁就先缩进一位继续比较,直到相遇。最后我们再对比所有记录的容量选出最大的那个即可~
代码:
class Solution {
public:int maxArea(vector<int>& height) {int n = height.size();int left = 0;int right = n-1;int sum = 0;int sum1 = 0;while(left<right){sum1 = min(height[left],height[right])*(right-left);if(height[right]>=height[left]){left++;}else{right--;}sum = max(sum,sum1);}return sum;}
};