LeetCode十一题:容纳最多水的容器【11/1000 python】

2024-04-05 05:52

本文主要是介绍LeetCode十一题:容纳最多水的容器【11/1000 python】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

👤作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅

LeetCode解锁1000题: 打怪升级之旅icon-default.png?t=N7T8https://blog.csdn.net/cciehl/category_12625714.html
python数据分析可视化:企业实战案例icon-default.png?t=N7T8https://blog.csdn.net/cciehl/category_12615648.html
备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

“容纳最多水的容器”是一个经典的数组和双指针问题,考验的是对空间利用和指针操作的理解。本文将通过不同的算法解决这个问题,并提供代码示例及详细的解题步骤。

问题描述

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

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

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

注意:你不能倾斜容器。

输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:数组中的第二个和最后一个元素形成的容器可以容纳最多的水,其面积为 49。

解题思路

方法一:暴力法

最直观的方法是尝试所有可能的两点组合,计算它们能形成的容器的面积,然后找出最大值。

解题步骤
  1. 遍历每一对索引组合 (i, j),其中 0 <= i < j < n
  2. 对每对索引计算容器的面积:Area = min(height[i], height[j]) * (j - i)
  3. 记录并更新最大面积。
python示例
def maxArea_v1(height: [int]) -> int:max_area = 0for i in range(len(height)):for j in range(i + 1, len(height)):area = min(height[i], height[j]) * (j - i)max_area = max(max_area, area)return max_area

复杂度分析

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

方法二:双指针法

双指针法是解决这个问题的最佳方法,它利用了“向内移动短板可以找到可能的更大面积”的直觉。

解题步骤
  1. 初始化两个指针分别指向数组的开头和结尾。
  2. 计算当前两个指针形成的容器的面积,并更新最大面积。
  3. 移动较短的一边的指针向内,直到两个指针相遇。
python示例
def maxArea(height: [int]) -> int:max_area, left, right = 0, 0, len(height) - 1while left < right:area = min(height[left], height[right]) * (right - left)max_area = max(max_area, area)if height[left] < height[right]:left += 1else:right -= 1return max_area

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
双指针图解
初始状态

设想一个容器的左右边界由线段的两端组成。此时,左指针在数组的最开始位置(索引 0),右指针在数组的最末尾位置(索引 len(height) - 1)。这个容器的宽度是最大的。

  [1,8,6,2,5,4,8,3,7]^               ^|               |left           right
移动指针

接下来,我们比较左右指针指向的高度。为了增加容器的高度,我们总是向内移动较矮的边,因为容器的实际高度由较矮的那边决定。在每一步中,我们计算当前指针指向的容器能容纳的水量,并更新最大值。

如果左边较矮:
[1,8,6,2,5,4,8,3,7]^             ^left         right
如果右边较矮:

如果在某一步中,右指针指向的高度小于左指针指向的高度,那么我们移动右指针向左一位。

[1,8,6,2,5,4,8,3,7]^           ^left       right
结束条件

当左右指针相遇时,我们已经考虑了所有可能的容器,循环结束。

总结

“容纳最多水的容器”问题通过暴力法可以直观地理解问题,但双指针法在效率上大大提升,是解决这类问题的典型示例。学会双指针技巧不仅可以帮助我们优雅地解决这个问题,也是提升算法解题能力的重要手段。

这篇关于LeetCode十一题:容纳最多水的容器【11/1000 python】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877778

相关文章

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字