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;
    }
}
相关推荐
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
ChoSeitaku6 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
Fuxiao___6 小时前
不使用递归的决策树生成算法
算法
我爱工作&工作love我6 小时前
1435:【例题3】曲线 一本通 代替三分
c++·算法
白-胖-子7 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower7 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯7 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
Sunyanhui17 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展
一个不喜欢and不会代码的码农7 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
前端郭德纲7 小时前
浏览器是加载ES6模块的?
javascript·算法