Leetcode C++《热题 Hot 100-25》11.盛最多水的容器

Leetcode C++《热题 Hot 100-25》11.盛最多水的容器

切忌急躁,理解至上;循序渐进,接近最优

  1. 题目
    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

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

说明:你不能倾斜容器,且 n 的值至少为 2。

图中(要图是没有的,你可以去引用里面的原链接看)垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:

输入: [1,8,6,2,5,4,8,3,7]
输出: 49

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. 思路
  • 方案1:时间复杂度n*n,空间复杂度O(1)。这个题目蛮有意思,转换成数学要求就是找两个i和j,使得(j-i)*min(height[j],height[i])最大,暴力循环
  • 木桶理论,无意中聊天朋友分享的一个特别有趣的理论,如果长处集中且很长,那木桶斜过来也可以装好多水hh
  • 方案2:时间复杂度O(n),空间复杂度O(1) 贪心法,控制矩形的两个边界
    • 每次left和right不能都移动,要控制变量法
    • 变化高度小的一段,因为变化之后,可能得到一个更大的maxArea
  1. 代码
class Solution {
public:
    //昨晚晚睡一小时,困的不行,今早上又起不来,又没效率;关键时刻理智要控制住情感,12点必须睡
    /*int maxArea(vector<int>& height) {
        int maxRes = 0;
        for (int i = 0; i < height.size(); i++) {
            for (int j = i+1; j < height.size(); j++) {
                if ((j-i)*min(height[j],height[i]) > maxRes) {
                    maxRes = (j-i)*min(height[j],height[i]);
                }
            }
        }
        return maxRes;
    }*/

    //有没有其他方案捏
    //方案2:时间复杂度O(n),空间复杂度O(1)  贪心法,控制矩形的两个边界
    int maxArea(vector<int>& height) {
        int maxRes = 0;
        int left = 0;
        int right = height.size()-1;
        while(left < right) {
            maxRes = max(maxRes, (right-left)*min(height[right],height[left]));
            if (height[left] > height[right]) {
                right--;
            } else {
                left++;
            }
            
        }
        return maxRes;
    }
};
发布了205 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/104165876
今日推荐