【力扣算法12】之 11. 盛最多水的容器 python

简介: 【力扣算法12】之 11. 盛最多水的容器 python

问题描述


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

思路分析

  1. 首先,我们定义了一个Solution类,其中包含解决问题的方法maxArea。
  2. 方法maxArea接收一个整数数组height作为参数。
  3. 我们通过双指针来解决这个问题。左指针left初始化为数组的第一个元素下标0,右指针right初始化为数组最后一个元素的下标n-1。
  4. 初始化最大面积max_area为0。
  5. 进入循环,条件是左指针小于右指针。这是因为当左指针和右指针相遇时,无法再构成有效的容器。
  6. 在每一次循环中,我们计算当前的面积curr_area。面积的计算公式是两个指针所指高度较小值乘以两个指针之间的距离即(right - left)。
  7. 更新最大面积max_area,通过将当前面积curr_area与max_area比较,如果curr_area更大,则更新max_area。
  8. 接下来,根据以下三种情况移动指针:
  • 如果height[left]小于height[right],那么我们将左指针left向右移动一位,即left += 1,因为移动左指针不能增加当前的面积。
  • 如果height[left]大于height[right],那么我们将右指针right向左移动一位,即right -= 1,因为移动右指针不能增加当前的面积。
  • 如果height[left]等于height[right],那么我们既可以移动左指针也可以移动右指针。在这种情况下,无论移动哪个指针,都不会改变当前的面积。
  1. 循环结束后,返回最大面积max_area作为结果。

这种解决方法的核心思想是通过不断缩小有效宽度的范围,来寻找容器的最大面积。通过比较较小高度的指针向内移动,可以保留更有可能得到更大面积的高度。最终,我们得到了两条垂线所形成容器的最大面积。

代码分析

  1. 首先,我们定义了一个Solution类。
  2. 在类中,我们定义了一个方法maxArea,它接收一个整数数组height作为参数。
  3. 我们首先获取数组height的长度n,用于后续循环的条件判断。
  4. 初始化左指针left为0,右指针right为数组最后一个元素的下标n-1。
  5. 初始化最大面积max_area为0。
  6. 进入循环,条件是左指针left小于右指针right。
  7. 在循环中,我们计算当前的面积curr_area,即两个指针所指高度较小值乘以两个指针之间的距离,使用min()函数取得较小值。
  8. 更新最大面积max_area,通过将当前面积curr_area与max_area比较,并将较大值赋给max_area,用max()函数实现。
  9. 接下来,使用三个判断条件来决定指针的移动:
  • 如果height[left]小于height[right],说明左指针指向的高度较低,移动左指针left向右移动一位,即left += 1。
  • 如果height[left]大于height[right],说明右指针指向的高度较低,移动右指针right向左移动一位,即right -= 1。
  • 如果height[left]等于height[right],说明两边的高度相等,无论左指针left还是右指针right都可以移动,所以同时将左指针left向右移动一位,即left += 1,右指针right向左移动一位,即right -= 1。
  1. 循环结束后,返回最大面积max_area作为结果。

完整代码

class Solution(object):
    def maxArea(self, height):
        n = len(height)  # 获取数组height的长度n
        left, right = 0, n - 1  # 初始化左指针left为0,右指针right为数组最后一个元素的下标n-1
        max_area = 0  # 初始化最大面积max_area为0
        while left < right:  # 进入循环,条件是左指针left小于右指针right
            curr_area = min(height[left], height[right]) * (right - left)  # 计算当前的面积curr_area,即两个指针所指高度较小值乘以两个指针之间的距离
            max_area = max(max_area, curr_area)  # 更新最大面积max_area,通过将当前面积curr_area与max_area比较,并将较大值赋给max_area
            if height[left] < height[right]:  # 如果height[left]小于height[right]
                left += 1  # 移动左指针left向右移动一位
            elif height[left] > height[right]:  # 如果height[left]大于height[right]
                right -= 1  # 移动右指针right向左移动一位
            else:  # 如果height[left]等于height[right]
                left += 1  # 同时移动左指针left向右移动一位
                right -= 1  # 同时移动右指针right向左移动一位
        return max_area  # 返回最大面积max_area作为结果

详细分析

  1. 首先定义一个名为Solution的类。
class Solution(object):
• 1
  1. 然后,我们在Solution类中定义了一个名为maxArea的方法,该方法接收一个名为height的参数。
def maxArea(self, height):
• 1
  1. 在方法体内部,我们获取数组height的长度,并将结果赋给变量n。
n = len(height)
• 1
  1. 接下来,我们初始化左指针left为0,右指针right为数组最后一个元素的下标n-1。
left, right = 0, n - 1
• 1
  1. 我们还定义了一个变量max_area,并将其初始化为0,用于保存最大面积的值。
max_area = 0
• 1
  1. 在接下来的while循环中,我们判断左指针是否小于右指针,如果是,则执行循环体内的代码。
while left < right:
• 1
  1. 在循环体内部,我们首先计算当前的面积curr_area,即两个指针所指高度较小值乘以两个指针之间的距离。
curr_area = min(height[left], height[right]) * (right - left)
• 1
  1. 接着,我们更新最大面积max_area,通过将当前面积curr_area与max_area比较,并将较大值赋给max_area。
max_area = max(max_area, curr_area)
  1. 然后,我们根据左指针和右指针指向的高度来移动指针。
  • 如果左指针指向的高度小于右指针指向的高度,则将左指针向右移动一位。
if height[left] < height[right]:
                left += 1
  • 如果左指针指向的高度大于右指针指向的高度,则将右指针向左移动一位。
elif height[left] > height[right]:
                right -= 1
  • 如果左指针指向的高度等于右指针指向的高度,则同时将左指针向右移动一位,并将右指针向左移动一位。
else:
                left += 1
                right -= 1
  1. 循环结束后,我们返回最大面积max_area作为结果。
return max_area
• 1

运行效果截图


调用示例


solution = Solution()
x = [1,8,6,2,5,4,8,3,7]
x1 = [1,1]
print(solution.maxArea(x))
print(solution.maxArea(x1))

运行结果

完结


相关文章
|
4月前
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
4月前
|
存储 监控 算法
监控电脑屏幕的帧数据检索 Python 语言算法
针对监控电脑屏幕场景,本文提出基于哈希表的帧数据高效检索方案。利用时间戳作键,实现O(1)级查询与去重,结合链式地址法支持多条件检索,并通过Python实现插入、查询、删除操作。测试表明,相较传统列表,检索速度提升80%以上,存储减少15%,具备高实时性与可扩展性,适用于大规模屏幕监控系统。
172 5
|
5月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
261 26
|
4月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
5月前
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
499 4
|
5月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
702 4
|
5月前
|
算法 机器人 定位技术
【机器人路径规划】基于流场寻路算法(Flow Field Pathfinding)的机器人路径规划(Python代码实现)
【机器人路径规划】基于流场寻路算法(Flow Field Pathfinding)的机器人路径规划(Python代码实现)
299 4
|
5月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(Python代码实现)
313 3
|
5月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
297 0
|
5月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)
417 0

推荐镜像

更多