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中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常