leetcode题解-11.盛最多水的容器

文章目录

  • 题目描述
  • 思路解析
  • 题解代码
  • 后记


博客专栏地址:https://blog.csdn.net/feng964497595/category_9848847.html
github地址:https://github.com/mufeng964497595/leetcode


题目描述

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

思路解析

  1. 看到题目,第一反应就是直接暴力求解,两个for循环嵌套计算每队组合的值,取最大值就可以了。

  2. 暴力求解还是太暴力了点,有没有优化一点的算法呢?对于这种一堆数据找两个数的,一般会想到尺取法,两个指针从左边开始移动。不过这道题要取的答案跟两个数的下标也有关系,那么就不能都从左边开始了,试试看一左一右可不可以。

  3. 两个指针一个从最左边开始,记为left,另一个从最后边开始,记为right。此时区间[left, right]就笼罩的区间结果就可以直接算出: m i n ( h e i g h t [ l e f t ] , h e i g h t [ r i g h t ] ) ∗ ( r i g h t − l e f t ) min(height[left], height[right]) * (right - left) min(height[left],height[right])(rightleft)

  4. 算完了,接下来要怎么搞咧?肯定要么移动left,要么移动right。那么到底移动哪个?我们来分析分析。不管是移动left还是right,移动后的 r i g h t − l e f t right - left rightleft都是一样的,那么水的容量就取决于移动后的 h e i g h t [ l e f t ] height[left] height[left] h e i g h t [ r i g h t ] height[right] height[right]中较小的那个。

    • 如果我们移动原先高度较高的那个指针,那么移动后的水容量高度<=移动前最短的高度
    • 如果我们移动原先高度较低的那个指针,那么移动后的水容量高度<=移动前最高的高度
  5. 对比很明显,肯定是移动高度较低的那个下标。如果高度一样,那移动谁都无所谓。

题解代码

class Solution {
public:
    int maxArea(vector& height) {
        int ans = 0;
        int left = 0, right = height.size() - 1;
        while (left < right) {
            ans = std::max(ans, std::min(height[left], height[right]) * (right - left));
            if (height[left] < height[right]) {
                ++left;
            } else {
                --right;
            }
        }

        return ans;
    }
};

后记

本周做的题目当作是把上周的给补上了吧,目前还欠着本周的两道中等一道困难,共勉

你可能感兴趣的:(leetcode,数据结构与算法)