关于Leetcode的刷题方法,在网上看了很多,每个人都有着不同的见解。作为Leetcode小白,我还是决定用最原始的方法进行刷题,即把每一题的思路都记录下来,虽然比较耗时间,但是个人感觉这样子的方法会让我对题目有更深入的了解。希望能在该专栏中记录下刷题过程中遇到的大大小小的问题🍊。
题目描述
解题思路
- 这题我是看了官方题解才想出来这种方法的,因为之前没接触过双指针这种思想,然后自己硬想的话也只能想到暴力法,当作增长些见识吧,以后遇到这种多个变量同时变化的题目可以往双指针这个方向上去思考。
- 由题意可得,盛水的体积 = 两条线之间的距离 * 两条线较小的值
- 因此本题制约最终结果的因素有两个,最容易想到的就是暴力法,通过二重循环遍历所有情况。
- 实际上这种随着一个变量的变化,另一个变量也跟着变化的例子,要破解双变量带来的不确定性,只能从两个变量的确定规律入手:
- 从上面的公式看到,两条线中较小的值决定了盛水体积的上限,那么如果我们让另一个变量(两条线之间的距离)呈一定规律变化(从两边的边界不断缩小),同时变化的规则又是由当前变量决定的(将两条线中较小值的线向内移动),这样子就能够确保我们不会错过更好的最终结果。
代码框架设计
- 创建两个指针,开始的时候分别指向数组的两端
- 初始化最大盛水体积V为0
- 只要两个指针不相等,则进入下面的循环:
- 如果当前两个指针形成的面积大于最大盛水体积V,就更新V
- 如果左指针对于的数组的值比右指针小,则左指针向右移,试图在缩短距离的情况下寻找更优解
- 否则右指针向左移
题目代码
class Solution {
public:
int maxArea(vector<int>& height) {
int res = 0;
int i = 0,j = height.size() - 1;
//大前提:不断缩小区间
while(i!=j){
res = max(res,(j - i) * min(height[i],height[j]));
if(height[i] < height[j])
i++;
else
j--;
}
return res;
}
};