LeetCode刷题(python版)——Topic10盛最多水的容器

本文解析了一道关于求解容器能装水最大容量的算法题,介绍了暴力双层循环解法的局限和折半逼近的高效解决方案,展示了从误解题目到正确解法的心路历程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题设

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

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

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

说明:你不能倾斜容器。

二、基本思路

1.双层循环暴力解,直接无脑,但很容易超出限制,归根结底还是给的用例太多了,我看了一个案例有密密麻麻整两屏幕,服了。。。不过蓝桥杯上暴力解应该问题不大,leetcode有时间限制。

2.折半逼近,确实好用,有点类似折半查找。其实就是利用折半找到最大两个数的下标就完事了。

三、代码实现

1.暴力解

class Solution(object):
    def maxArea(self, height):
        select1 = 0 #选择第一根柱子下标
        select2 = 0 #选择第二根柱子下标
        sum_water = 0 #最大水量是多少
        stage_sign = 0 #记录最高水位
        for i in range(len(height)):#遍历第一根可能的柱子
            for j in range(i,len(height)):#遍历的第二根可能的柱子
                select1 = i #第一根柱子下标
                select2 = j #第二根柱子
                current_water = 0
                max_stage = min(height[select1],height[select2]) #最大水位
                current_water = max_stage * (select2 - select1) #盛水量计算
                if current_water > sum_water:#比较记录
                    sum_water = current_water
        return sum_water

                

2.折半逼近

class Solution(object):
    def maxArea(self, height):
        select1 = 0 #选择第一根柱子下标
        select2 = len(height)-1 #选择第二根柱子下标
        sum_water = 0 #最大水量是多少
        while select1<select2:
            current_water = min(height[select1] , height[select2]) * (select2 - select1)
            if current_water > sum_water:
                sum_water = current_water
            if height[select1] > height[select2]:
                select2 -= 1
            else:
                select1 += 1
        return sum_water

                

四、效率总结

        效率?法一没有效率可言,但是确实是一般人想到的最直接的方法,如果测试用例通过,那这题无疑是简单题,这题的关键就在于一下子看出不能用暴力,而又是在一堆数据中挑出两个数据,稍微熟练一些的开发者就会想到两边逼近,折半。关于题目呢,我真的不理解为什么图要画成那个样子,我第一个反应竟然是往不同高度的管子里灌水,蓝色部分是一个水缸,题目看成了求解中间水管能装多少水了哈哈哈,然后我又抽风了,我以为左管子只能取到[0,(len-1)/2)的范围,右管子取到[len-1)/2,len),对自己真的很无语。浅浅给大家看一下我之前看错题目敲得代码。这几天在忙着修改几篇论文,漏了三天的题目没做了,今天尽量多补几道,那么待会见哈哈哈~

class Solution(object):
    def maxArea(self, height):
        select1 = 0 #选择第一根柱子下标
        select2 = 0 #选择第二根柱子下标
        sum_water = 0 #最大水量是多少
        left_sign = 0 #记录最大水量的左标
        right_sign = len(height) #记录最大水量的右标
        stage_sign = 0 #记录最高水位
        #return len(height)
        #return len(height)/2
        for i in range(len(height)/2):#遍历第一根可能的柱子
            for j in range(len(height)/2 , len(height)):#遍历的第二根可能的柱子
                select1 = i #第一根柱子下标
                select2 = j #第二根柱子
                current_water = 0
                max_stage = min(height[select1],height[select2]) #最大水位
                for k in range(select1+1,select2):
                    if height[k] > max_stage:
                        current_water += max_stage
                    else:
                        current_water += height[k]
                if current_water > sum_water:
                    sum_water = current_water
                    left_sign = i
                    right_sign = j
                    stage_sign = max_stage
        return i,j,stage_sign,sum_water

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值