LeetCode11. 盛最多水的容器题解

LeetCode11. 盛最多水的容器题解

题目链接:

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

示例

思路

暴力解法

定住一个柱子不动,然后用其他柱子与其围住面积,取最大值。

代码如下:

java 复制代码
public int maxArea1(int[] height) {
    int n = height.length;
    int ans = 0;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            int area = Math.min(height[i], height[j]) * (j - i);
            ans = Math.max(ans, area);
        }
    }
    return ans;
}

此方法的时间复杂度为O(n^2),很显然太慢。我们需要想其他的思路。

对撞指针

暴力解法的搜索空间如下

那么我们是否可以缩小搜索空间呢?

以第一行为例,高度限制为1了,那么我们只需要看宽度最大的地方即可,第一行搜索空间中所有灰色的都不用看了;

以第二行为例,我们不止要看宽度最大的地方,因为height[right]会变大,所以我们只需要看第二行图中三个即可。

以此类推;

我们定义:

left为数组开始位置;

right为数组结束位置;

初始化所求最大面积为result = 0;

  1. 计算result = Max(result,left和right之间围成的面积);
  2. 如果height[left] <= height[right]:left++;
  3. 如果height[left] > height[right]:right--;
  4. 直到left > right;

代码如下

java 复制代码
class Solution {
    public int maxArea(int[] height) {
        if (height == null || height.length <= 1) return 0;

        int left = 0, right = height.length - 1;
        int result = 0;

        while (left < right) {
            //计算面积
            result = Math.max(result, Math.min(height[left], height[right]) * (right - left));
            if (height[left] <= height[right]) {
                left++;
            } else {
                right--;
            }
        }

        return result;
    }
}
相关推荐
栗少19 分钟前
英语自学手册:系统化进阶指南基于《英语自学手册》的方法论与行动路径
人工智能·算法
Xの哲學1 小时前
深入解析 Linux systemd: 现代初始化系统的设计与实现
linux·服务器·网络·算法·边缘计算
sinat_255487811 小时前
InputStream/OutputStream小讲堂
java·数据结构·算法
cici158742 小时前
基于GPRMAX的地下管线正演模拟与MATLAB实现
开发语言·算法·matlab
副露のmagic2 小时前
更弱智的算法学习 day16
数据结构·学习·算法
DeepVis Research2 小时前
【Storage/Signal】2026年度非线性存储一致性与跨时域信号处理基准索引 (Benchmark Index)
算法·网络安全·数据集·分布式系统
liliangcsdn2 小时前
VAE中Encoder和Decoder的理论基础的探索
人工智能·算法·机器学习
Love Song残响2 小时前
30字高效MATLAB优化指南
数据结构·算法
sin_hielo3 小时前
leetcode 1975
数据结构·算法·leetcode
cpp_25013 小时前
P1583 魔法照片
数据结构·c++·算法·题解·洛谷