⭐LeetCode 11. Container With Most Water

题目描述

在这里插入图片描述

知识点

双指针(其实应该是左右指针)

结果

在这里插入图片描述

实现

码前思考

我没写出来

代码实现

//使用非常微妙的双指针来解题
//其实解题吧,先从暴力开始,然后考虑暴力有哪些地方可以优化
//这道题目就是典型的先思考暴力解法,然后对暴力中不必要的地方进行优化
//但是能够想到双指针实在是非常难呀!
class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0;
        int right = height.size()-1;

        int res = 0;    //初始化最小为0,因为可能s就是0!

        while(left != right){
            int s = min(height[left],height[right]) * (right - left);
            if(s > res){
                res = s;
            }

            //缩短板,注意思考一下两者相等的情况,其实是很有意思的!
            if(height[left] > height[right]){
                right--;
            }else{
                left++;
            }
        }

        return res;
    }
};

码后反思

首先这道题目我没有一点的思路!只会暴力,但是想了想这是中等难度的题,不能随便暴力的!然后事实证明暴力的 O ( n 2 ) O(n^2) 居然也能过题,看来LeetCode不太严格呀。

谈归正传,来看看网友是怎么使用双指针来解决这个问题:

我不知道为什么网友会想到双指针来解题,感觉这种题目很难想到双指针啊。下面只是证明为什么双指针可以。

  1. 该题双指针的思路是在暴力的基础上进行优化的。具体来说之前暴力的解法是 C n 2 C_n^2 的方式,使用双指针对于每次的边缘的那个短板,求解短板在该边缘下的最好面积,即边缘面积。这样最后leftright相遇时,其实暴力所有的情况都考虑了,只是使用了一点短板的性质。具体思路请看参考文档。
  2. 每次指针的移动,一定的是边缘短板对应的那个指针。因为边缘短板的情况已经考虑完全了,可以舍弃了!

参考文档

  1. 盛最多水的容器(双指针法,易懂解析,图解)
发布了173 篇原创文章 · 获赞 3 · 访问量 5209

猜你喜欢

转载自blog.csdn.net/yc_cy1999/article/details/105715229