leetcode 盛水最多的容器(双指针)

给定 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 class Solution {
 2 public:
 3     int maxArea(vector<int>& height)
 4     {
 5         int len=height.size();
 6         if(len==0) return 0;
 7         int l=0,r=len-1,ans=0;
 8         while(l<r)
 9         {
10             ans=max(ans,min(height[l],height[r])*(r-l));
11             if(height[l]<height[r]) ++l;
12             else --r;
13         }
14
15         return ans;
16     }
17 };

C++

原文地址:https://www.cnblogs.com/csushl/p/12358497.html

时间: 2024-10-08 16:04:15

leetcode 盛水最多的容器(双指针)的相关文章

LeetCode第11题 盛水最多的容器

/* 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) . 在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0). 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水. 说明:你不能倾斜容器,且 n 的值至少为 2.*/ 思路: 类似于木桶效应. 每次移动较短的线,保持长线不动.(如果短线不动而长线动,容量减小(y没有增大反而x变小)) 记录最大值. 1 class Solution11 { 2 3 pu

leetcode 11盛水最多的容器

class Solution { public: int maxArea(vector<int>& height) { //双指针法:从最宽的容器开始计算,当更窄的容器盛水量要大于之前容器,那必须比之前容器高,因此可以移动两个指针,直到最窄time O(n),space O(1); int low=0; int high=height.size()-1; int volume=0; while(low<high){ int h=min(height[low],height[hig

盛水最多的容器

题目:给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水.说明:你不能倾斜容器,且 n 的值至少为 2.来源:https://leetcode-cn.com/problems/container-with-most-water/ 法一:双指针法 思路:由于是求最大的存水面积,易知影响存水面积S的只有两

[leetcode]11. Container With Most Water存水最多的容器

Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a contain

LeetCode 11 - 盛最多水的容器 - [双指针暴力]

题目链接:https://leetcode-cn.com/problems/container-with-most-water/description/ 给定 n 个非负整数 $a_1,a_2,\cdots,a_{n-1},a_n$,每个数代表坐标中的一个点 $(i, a_i)$.在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 $(i, ai_)$ 和 $(i, 0)$. 找出其中的两条线,使得它们与 $x$ 轴共同构成的容器可以容纳最多的水. 说明:你不能倾斜容器,且 $n$ 的值至少

容器盛水问题

一.问题描述 给定一数组ary,元素两两组合,以min{ary[i],ary[j]}为高,以跨度(j-i)为宽可组成一个容器,求所有这样的容器的最大面积maxVolume. 二.算法分析 以数组ary为例:int[] ary = {3,2,6,8,1,7};如果从蛮力法的角度来看.相当于从以上6个元素中选两个不考虑排序,是组合问题.C(n,m) = C(6,2) = 15不难想到,遍历15种组合的volume值,然后取其最大值,定能够求解.但是我们真的需要求15中全部的情况吗?从另一个角度看来有

11. Container With Most Water 装水最多的容器

[抄题]: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a co

【OJ】【Leetcode】【链表】【双指针】160. 相交链表

题目 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0).从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B

【LeetCode】水题(刚开始重新刷题找感觉用的)

[500]  Keyboard Row [Easy] 给N个单词,判断哪些单词的字母在键盘的同一行,输出这些单词. 1 class Solution { 2 public: 3 set<char> setLine1{'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'}, 4 setLine2{'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'}, 5 setLine3{'z', 'x', 'c', 'v', 'b