Leetcode 每日一题 11. 盛最多水的容器

server/2024/11/24 21:21:39/

目录

引言

问题背景

输入输出规范

示例解析

示例 1

示例 2

算法策略

Java代码实现

复杂度分析

结语


引言

算法的世界里,有些问题虽然简单,但却是锻炼算法思维的绝佳练习。今天,我们将深入探讨一个在面试中经常出现的问题——“接雨水”问题。这个问题不仅考验我们对数组操作的熟练程度,还考察我们如何利用数组的特性来优化算法。本文将详细介绍如何使用双指针法解决“接雨水”问题,并提供Java语言的实现。

问题背景

给定一个长度为 n 的整数数组 height,代表 n 条垂线的高度。我们的任务是找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。这个问题实际上是在询问,如何通过选择两条垂线来最大化容器的储水量。

输入输出规范

  • 输入:整数数组 height,一个包含垂线高度的数组。
  • 输出:整数 maxArea,表示容器可以储存的最大水量。

示例解析

示例 1

  • 输入height = [1,8,6,2,5,4,8,3,7]
  • 输出49
  • 解释:选择高度为 8 和 6 的两条线,它们与 x 轴构成的容器能够容纳的最大水量为 49。

示例 2

  • 输入height = [1,1]
  • 输出1
  • 解释:选择两条高度为 1 的线,它们与 x 轴构成的容器能够容纳的最大水量为 1。

算法策略

双指针法是解决此类问题的常用策略。我们利用数组的特性,通过两个指针 leftright 分别指向数组的两端,通过调整这两个指针的位置来寻找能够构成最大储水量的两条线。

  • 初始化left 指向数组的开始,right 指向数组的末尾。
  • 计算面积:计算两条线之间的宽度与它们高度的最小值的乘积作为当前面积。
  • 调整指针
    • 如果左边的高度小于右边的高度,则 left 向右移动,因为我们需要一个更高的线来增加储水量。
    • 如果左边的高度大于或等于右边的高度,则 right 向左移动,因为我们需要一个更高的线来增加储水量。
  • 循环直至相遇:重复上述步骤,直到 left 和 right 相遇。

Java代码实现

 

java

public class Solution {public int maxArea(int[] height) {int max = 0;int left = 0, right = height.length - 1; // 初始化左右指针while (left < right) { // 循环直至左右指针相遇int currentArea = (right - left) * Math.min(height[left], height[right]);if (max < currentArea) {max = currentArea; // 更新最大面积}if (height[left] < height[right]) {left++; // 增加左边的高度} else {right--; // 增加右边的高度}}return max; // 返回最大面积}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 height 的长度。每个元素最多被访问两次。
  • 空间复杂度:O(1),只需要常量级的额外空间来存储结果。

通过图片

leetcode地址

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

结语

通过双指针法,我们不仅解决了“接雨水”问题,还展示了如何利用数组的特性来优化算法。这种方法的时间复杂度和空间复杂度都非常低,适用于处理大规模数据集。希望这篇文章能够帮助你深入理解双指针法,并将其应用到实际问题中。如果你有任何疑问或想要进一步探讨,欢迎在评论区交流。同时,如果你觉得这篇文章对你有帮助,不妨点个赞或者分享给需要的朋友。让我们一起进步,一起成长!


http://www.ppmy.cn/server/144640.html

相关文章

SpringBoot中小企业人事管理系统:设计模式

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;中小企业人事管理系统当然也不能排除在外。中小企业人事管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和…

使用minio cllient(mc)完成不同服务器的minio的数据迁移和mc基本操作

前言 最近需要将一个服务器上的minio桶的数据迁移到新服务器上,所以学习了一下,使用的是minio client。 MinIO Client (mc) 是一个用于与 MinIO 和其他兼容 Amazon S3 的云存储服务交互的命令行工具。MinIO 是一个高性能的对象存储服务器,mc 提供了一个丰富的命令集来管理对…

Spring 中的 ProxyFactory 创建代理对象

一、jdk 动态代理 和 cglib动态代理 简单介绍 1.jdk动态代理 public interface AService {public String serviceA(String param);public String serviceAA(String param); } public interface BService {public String serviceB(String param);public String serviceBB(Str…

C语言-11-18笔记

1.C语言数据类型 类型存储大小值范围char1 字节-128 到 127 或 0 到 255unsigned char1 字节0 到 255signed char1 字节-128 到 127int2 或 4 字节-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647unsigned int2 或 4 字节0 到 65,535 或 0 到 4,294,967,295short2 字节…

Android 基于Camera2 API进行摄像机图像预览

前言 近期博主准备编写一个基于Android Camera2的图像采集并编码为h.264的应用&#xff0c;准备分为三个阶段来完成&#xff0c;第一阶段实现Camera2的摄像机预览&#xff0c;第二阶段完成基于MediaCodec H.264编码&#xff0c;第三阶段完成基于MediaCodec H.264解码,针对不同…

python探测脚本

编写一个脚本test_ip.py实现指定参数的远程主机网络探测 python test_ip.py 192.168.0.10 192.168.0.100 针对192.168.0.10~192.168.0.100范围内所有主机进行网络探测 import sys import time获取命令行参数&#xff1a;python test_ip.py 192.168.0.10 192.168.0.100 initial_…

纯HTMLCSS实现3D旋转地球

效果演示 这段 HTML 和 CSS 代码创建了一个带有动画效果的星空背景&#xff0c;其中包含闪烁的星星和一个旋转的地球图案。 HTML <div class"section-banner"><div id"star-1"><div class"curved-corner-star"><div id…

网页F12:缓存的使用(设值、取值、删除)

一、设置值 例如&#xff1a;设置一个key为name&#xff0c;value为Jack的值 1、在控制台输入代码 localStorage.setItem(name,Jack) 2、查看缓存值 二、取值 1、在控制台输入代码 取出key为name的值 localStorage.getItem(name) 三、删除 删除指定key的值 1、在控制台输…