LeetCode 11.盛最多水的容器(c++)

123 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

11.盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

image.png

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49

示例 2:

输入:height = [1,1]
输出:1

提示:

n == height.length
2 <= n <= 105
0 <= height[i] <= 104

二、思路分析

这是一道中等难度的题目,给定一个数组,要根据这个数组中的元素求能容纳水的最大体积。我没有什么经验,所以最先想到的还是遍历,通过for循环进行遍历,因此我采用了两个for循环,可惜的是在提交时,因为一个很长的输入数组而导致最后超出时间限制。我也不知道这是否是我的程序最后得出的结果有问题的意思。

于是我看了网上对于这题的思路,发现前几天所使用的双指针在这题中也能用到,于是又尝试用双指针解题,不得不说,用双指针来解这道题是比较方便的。但前提是你需要理清这道题中所隐含的信息。

在指针遍历的过程中,无论是向左还是向右,肯定要移动一个。那么是应该移动左边的指针还是右边的指针呢?这是要重点注意的地方。

无论移动哪一边,肯定会损失掉1个单位的短的一边的体积。如果移动长的一边,那么体积肯定不可能增加,只有可能不变或者减少。因为体积的计算是取决于短的一边和两个指针之间的距离。而移动短的一边,体积则有可能增加。

所以我们每移动一步都应该观察两边指针那边是代表短的一边,然后计算出此时的体积是否比此前体积大,是的话则用此时的体积取代此前的体积,不是的话则此前的体积不变。然后代表短的一边的指针移动一步。

三、AC代码

class Solution {
public:
    int maxArea(vector<int>& height) {
int l=0,r=height.size()-1,s=0,t=0;
while(l<r)
{
    if(height[l]>height[r])
{
    t = height[r] * (r - l);
    r--;
}
else
{
    t = height[l] * (r - l);
    l++;
}
s = (t > s ? t : s);
}
return s;
    }
};

提交排名

image.png

四、总结

这道题目有一定的难度,但难度不算很大,考验了双指针。之前我做过用到了双指针方法的题目,但在做这题的时候却没有回想,应该吸取教训。