栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

一、题设

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1029408.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号