【算法】11. 盛最多水的容器(多语言实现)

简介: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明: 你不能倾斜容器。

11. 盛最多水的容器:

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

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

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

说明: 你不能倾斜容器。

样例 1:

输入:
    [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

原题传送门:

https://leetcode.cn/problems/container-with-most-water/description/


分析

  • 面对这道算法题目,二当家的陷入了沉思。
  • 最终放多少水,只和宽度,高度有关。
  • 由于有两个变量,所以很难一下判断如何才能最大。
  • 我们不妨先让一个量最大,这样结果就只和另一个量有关了。
  • 我们先取最左和最右两个端点构成容器,这时候容器的宽度最大,高度只能是两个端点较小的一个,记录下来盛水量。
  • 下一步,我们将较小的一个端点向中间移动,宽度会缩小,所以我们希望能找到更高的端点,如果移动较高的端点,那么容器的高度不会变高,因为被低的那个端点限制了,所以我们应该移动那个低的端点,这样才有希望找到更高的端点,使得容器整体变高。

题解

rust

impl Solution {
   
   
    pub fn max_area(height: Vec<i32>) -> i32 {
   
   
        let mut maxArea = 0;
        let mut l = 0;
        let mut r = height.len() - 1;
        while l < r {
   
   
            let mut area;
            if height[l] < height[r] {
   
   
                area = (r - l) as i32 * height[l];
                l += 1;
            } else {
   
   
                area = (r - l) as i32 * height[r];
                r -= 1;
            }
            maxArea = maxArea.max(area);
        }
        return maxArea;
    }
}

go

func maxArea(height []int) int {
   
   
    maxArea := 0
    l := 0
    r := len(height) - 1
    for l < r {
   
   
        var area int
        if height[l] < height[r] {
   
   
            area = (r - l) * height[l]
            l++
        } else {
   
   
            area = (r - l) * height[r]
            r--
        }
        if area > maxArea {
   
   
            maxArea = area
        }
    }
    return maxArea
}

c++

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

java

class Solution {
   
   
    public int maxArea(int[] height) {
   
   
        int maxArea = 0;
        int l       = 0, r = height.length - 1;
        while (l < r) {
   
   
            int area;
            if (height[l] < height[r]) {
   
   
                area = (r - l) * height[l++];
            } else {
   
   
                area = (r - l) * height[r--];
            }
            maxArea = Math.max(maxArea, area);
        }
        return maxArea;
    }
}

typescript

function maxArea(height: number[]): number {
   
   
    let maxArea = 0;
    let l       = 0, r = height.length - 1;
    while (l < r) {
   
   
        let area;
        if (height[l] < height[r]) {
   
   
            area = (r - l) * height[l++];
        } else {
   
   
            area = (r - l) * height[r--];
        }
        maxArea = Math.max(maxArea, area);
    }
    return maxArea;
};

python

class Solution:
    def maxArea(self, height: List[int]) -> int:
        l, r = 0, len(height) - 1
        ans = 0
        while l < r:
            if height[l] < height[r]:
                area = (r - l) * height[l]
                l += 1
            else:
                area = (r - l) * height[r]
                r -= 1
            ans = max(ans, area)
        return ans

非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~


相关文章
|
2月前
|
自然语言处理 Rust 算法
【算法】13. 罗马数字转整数(多语言实现)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 | 字符 | 数值 | |--|--| | I | 1 | | V | 5 | | X | 10 | | L | 50 | | C | 100 | | D | 500 | | M | 1000 | 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1
【算法】13. 罗马数字转整数(多语言实现)
|
2月前
|
存储 容器
LeetCode刷题---11. 盛最多水的容器(双指针-对撞指针)
LeetCode刷题---11. 盛最多水的容器(双指针-对撞指针)
|
4天前
|
自然语言处理 Rust 算法
【算法】17. 电话号码的字母组合(多语言实现)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
【算法】17. 电话号码的字母组合(多语言实现)
|
18天前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
39 10
|
7天前
|
算法 测试技术 程序员
力扣经典150题解析之二十八:盛最多水的容器
力扣经典150题解析之二十八:盛最多水的容器
5 0
|
1月前
|
算法 自然语言处理 Rust
【算法】16. 最接近的三数之和(多语言实现)
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。
|
20天前
|
容器
11.盛最多水的容器
11.盛最多水的容器
|
21天前
|
算法 容器
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
|
2月前
|
容器
11. 盛最多水的容器
11. 盛最多水的容器
22 1
|
2月前
|
容器
leetcode代码记录(盛最多水的容器
leetcode代码记录(盛最多水的容器
14 1