LeetCode - 11 盛最多水的容器

news2024/11/11 5:06:42

题目来源

11. 盛最多水的容器 - 力扣(LeetCode)

题目描述

给定一个长度为 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] <= 10^4

题目解析

本题可以利用双指针+贪心解题。

容器内水的容量大小 V,取决于容器两端中的较短柱子h_min,因此为了使得容器内水尽可能的多,我们应该找到距离 h_min 柱子最远的,且高度>= h_min 的另一个柱子。 

我们可以定义两个指针 L, R,分别指向 height 数组的首尾元素。

  • 若 height[L] < height[R],则说明 height[L] 是矮柱,而 height[R] 是距离 height[L] 最远的比它高的柱子,因此此时我们找到了 height[L] 作为容器矮柱的最优解。之后 L ++ 。
  • 若 height[L] > height[R],则说明 height[R] 是矮柱,而 height[L] 是距离 height[R] 最远的比它高的柱子,因此此时我们找到了 height[R] 作为容器矮柱的最优解。之后 R -- 。
  • 若 height[L] == height[R],则任意一个柱子作为矮柱都可以。

循环处理上面逻辑,直到 L >= R 时停止。

可能大家会有疑问,随着 L,R的内向移动,可能有一些矮柱无法找到最远的稍高柱子,比如下面例子:

可以发现,此时 L 作为矮柱,对应的最优解高柱应该是 R1,而不是 R。

那么为什么选择 L,R 组合,不会影响结果正确性呢?

因为我们通过双指针运动逻辑可知,R1在之前肯定已经被选作为矮柱过了,且其对应的高柱 L1 肯定是 < L 的。

也就是说 h[R1] * (R1 - L1 + 1) 的结果是肯定大于 h[L] * (R1 - L + 1) 的,因此这里 L 虽然没有匹配到最优高柱 R1,但是 R1 作为矮柱时的容器肯定比当前 R1 作为高柱时的容器盛水更多。

因此,我们可以忽略 R1 作为高柱的情况。

C源码实现

int maxArea(int* height, int heightSize) {
    int l = 0;
    int r = heightSize - 1;

    int ans = 0;

    while (l < r) {
        int h = height[l] <= height[r] ? height[l++] : height[r--];
        ans = (int)fmax(ans, h * (r - l + 1));
    }

    return ans;
}

C++源码实现

class Solution {
public:
    int maxArea(vector<int>& height) {
        int l = 0;
        int r = height.size() - 1;

        int ans = 0;

        while (l < r) {
            int h = height[l] <= height[r] ? height[l++] : height[r--];
            ans = max(ans, h * (r - l + 1));
        }

        return ans;
    }
};

Java源码实现

class Solution {
    public int maxArea(int[] height) {
        int l = 0;
        int r = height.length - 1;

        int ans = 0;

        while (l < r) {
            int h = height[l] < height[r] ? height[l++] : height[r--];
            ans = Math.max(ans, h * (r - l + 1));
        }

        return ans;
    }
}

Python源码实现

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        l = 0
        r = len(height) - 1

        ans = 0

        while l < r:
            if height[l] <= height[r]:
                h = height[l]
                l += 1
            else:
                h = height[r]
                r -= 1
            
            ans = max(ans, h * (r - l + 1))
        
        return ans

JavaScript源码实现

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function (height) {
    let l = 0;
    let r = height.length - 1;

    let ans = 0;

    while (l < r) {
        const h = height[l] <= height[r] ? height[l++] : height[r--];
        ans = Math.max(ans, h * (r - l + 1));
    }

    return ans;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小型集群分析

目录 介绍步骤 介绍 etcd是CoreOS基于Raft协议开发的分布式key-value存储&#xff0c;可用于服务发现、共享配置以及一致性保障&#xff08;如数据库选主、分布式锁等&#xff09;。 在分布式系统中&#xff0c;如何管理节点间的状态一直是一个难题&#xff0c;etcd像是专门为…

从关键新闻和最新技术看AI行业发展(第三十期2024.8.12-8.25) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&…

java利用JXL操作excel

通过JXL操作Excel JXL是韩国人所著,目前停止更新,只支持xls格式,即2007之前的版本 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java…

【论文解读】SAM模型超级进化:面向移动端的轻量级SAM,比FastSAM快4倍!(附论文地址)

论文地址&#xff1a;https://arxiv.org/pdf/2306.14289.pdf 这篇论文的标题是《FASTER SEGMENT ANYTHING: TOWARDS LIGHTWEIGHT SAM FOR MOBILE APPLICATIONS》&#xff0c;由Chaoning Zhang等人撰写&#xff0c;发表于2023年。 文章主要探讨了如何将Segment Anything Model&…

Docker构建镜像时本地NuGet不存在的解决方式

在打包镜像时&#xff0c;由于程序中使用了本地的NuGet包&#xff0c;发现怎么打包都是失败,错误如下 我的dockerfile 文件如下 FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 80# 此阶段用于生成服务项目 FROM mcr.microsoft.com/dotnet/sdk:8.0 A…

战略设计(Strategic Design)

战略设计(strategic design)——一种针对系统整体的建模和设计决策。这样的决策影响整个项目&#xff0c;而且必须由团队来制定。 随着系统的增长&#xff0c;它会变得越来越复杂&#xff0c;当我们无法通过分析对象来理解系统的时候&#xff0c;就需要掌握一些操纵和理解大的模…

Docker简介及部署方法

什么是 docker &#xff1f; Docker是一个开源的应用容器引擎&#xff0c;它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中&#xff0c;并几乎可以在任何支持的平台上运行。Docker利用Linux内核的功能&#xff08;如Cgroups和namespaces&#xff09;来实现对进程的…

《JavaEE进阶》----7.<SpringMVC实践项目:【登录页面的验证】>

这篇文章详细的讲解了一个 简单的登录网页的前端代码和后端代码的构造 使用了JavaScript中的ajax来进行前后端的交互 一、前端代码 登录页面代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>登录…

从0开始深度学习(2)——自动微分

1 微积分 1.1 导数和微分 略 1.2 偏导数 略 1.3 梯度&#xff08;gradient&#xff09; 1.3.1 定义 对于一个多变量函数 f ( x 1 , x 2 , … , x n ) f\left(x_{1}, x_{2}, \ldots, x_{n}\right) f(x1​,x2​,…,xn​)其中点 a ( a 1 , a 2 , … , a n ) \mathbf{a}(a_…

【栈经典问题剖析】上

1.1进制转换 1.1.2思路图解&#xff1a; 每次将得到的余数存入栈中&#xff0c;直到商为0时&#xff0c;停止入栈。依次将栈中元素出栈并进行打印操作&#xff08;注意负数的符号情况&#xff09; //进制转换&#xff1a;10进制整数转换成8进制整数 #include <stdio.h>…

Google的MapReduce和Hadoop的MapReduce基本原理

Google的MapReduce和Hadoop的MapReduce基本原理 MapReduce框架的执行过程可以概述为以下几个关键步骤&#xff1a; 输入分割&#xff1a;用户程序中的MapReduce库首先将输入文件分割成M个片段&#xff0c;每个片段通常大小在16MB到64MB之间&#xff0c;用户可以通过可选参数控制…

【leetcode413周赛】——前两题python

3274. 检查棋盘方格颜色是否相同 给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。 以下是棋盘的参考图。 如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。 坐标总是表示有效的棋盘方格。坐标…

【indirect 函数 ★二级下拉菜单】

Indirect 函数 &#x1f33c;indirect函数参数&#x1f33c;应用&#xff1a;&#x1f33c;跨表引用同一单元格&#x1f33c;二级下拉列表 &#x1f33c;indirect函数参数 返回⬅️【文本字符串所指定的引用】 INDIRECT(ref_text,[a1]) 其中【ref_text】是引用的文本 [a1] 是…

大数据之数据湖Apache Hudi

一、Hudi框架概述 Apahe Hudi (Hadoop Upserts delete and Incrementals) 是Uber主导开发的开源数据湖框架&#xff0c;为了解决大数据生态系统中需要插入更新及增量消费原语的摄取管道和ETL管道的低效问题&#xff0c;该项目在2016年开始开发&#xff0c;并于2017年开源&#…

Mysql基础练习题 1084.销售分析3 (力扣)

编写解决方案&#xff0c;报告 2019年春季 才售出的产品。即 仅 在 2019-01-01 &#xff08;含&#xff09;至 2019-03-31 &#xff08;含&#xff09;之间出售的商品 题目链接&#xff1a; https://leetcode.cn/problems/sales-analysis-iii/description/ 建表插入数据&…

学习指纹浏览器 处理美团mtgsig1.2 环境检测

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

恭喜各位天命人!2024年国自然基金放榜了!优青654项、杰青433项,附个人查询攻略

公众号&#xff1a;生信漫谈&#xff0c;获取最新科研信息&#xff01; 恭喜各位天命人&#xff01;2024年国自然基金放榜了&#xff01;优青654项、杰青433项&#xff0c;附个人查询攻略https://mp.weixin.qq.com/s?__bizMzkwNjQyNTUwMw&mid2247487048&idx1&sn1…

Webfunny前端监控如何搭建高并发使用场景

Webfunny可以支持千万级别PV的日活量了。但是&#xff0c;我们默认的部署配置&#xff0c;是无法支持这么高的日活量的&#xff0c;需要我们做一些支持高并发的配置和操作&#xff0c;下面让我们一起看下如何让webfunny支持更高的并发量吧&#xff0c;下图为webfunny高并发架构…

数据集格式转化

数据集格式转换的要点是从对应的格式中解析出对应的class和bbox 整体说明&#xff1a; lables_voc_dir&#xff1a; 为存放所有xml的标注文件夹&#xff0c;labels_yolo_dir: 为转换后存放所有xml的标注文件夹images_dir : 为所有图像文件的文件夹。、 注意&#xff1a;代码…

C++手撕简易list

目录 节点的准备 list类 push_back stl容器的遍历和修改 begin end ! 重载* 效果展示&#xff1a; const迭代器 方法一&#xff1a; 方法二&#xff1a; ->的重载 insert push_front erase 展示效果 pop_back && pop_front 效果展示 clear&am…