day5_leetcode11

本文详细解析LeetCode第11题“容器最多能装多少水”的算法实现,从暴力解法到优化方案,探讨不同代码结构对时间复杂度的影响,并对比分析最优解法。

Leetcode第11题:

 

1.题目:
        

 

2. 我的代码过程一:
       首先分析题意,就是给一个列表,然后以每一个元素的索引与其对应的元素构成一个坐标点,元素的大小就是该点的高度。然后要找出两两组合起来的体积最大的那个值,其实说体积不准确,因为是装水,所以两两组合时,考虑短板效应,高度要以最低的那个为准。
       我想了下,没找到什么特别的技巧,所以只得先写一段暴力解决方法:
代码:

class Solution(object):
    def maxArea(self, height):
        max_v = 0
        dic = {}
        for i, row in enumerate(height):
            dic[i] = row
        for i, row in dic.items():
            for j, col in dic.items():
                _min = row if row < col else col
                if (j-i)*_min > max_v:
                    max_v = (j-i)*_min
        return max_v


这段代码的时间复杂度是O(n)=n^3,也是最直接最暴力的方法,结果也是可以得到。但是,看图



看一下详细情况:
       


超出时间限制,也就是时间复杂度太大了,不能通过。那我就再想想能不能有什么减少复杂度的方法

 

3. 过程2:
代码:

class Solution(object):
    def maxArea(self, height):
        max_v = 0
        for i, row in enumerate(height):
            for j, col in enumerate(height):
                _min = row if row < col else col
                if (j-i)*_min > max_v:
                    max_v = (j-i)*_min
        return max_v


        时间复杂度O(n)=n^2,但是结果还是不能通过。之后我又想了一些方法,但是还是不行,最后只得求助了,但是leetcode是这样的,如果你没有一次通过的话,那你就看不到别人提交的范例。按理说这些题目拿去Google一下,肯定会有结果的,其实还可以去这个网站LintCode解题,


        然后将这一道题的题目放上去搜索就会有答案了,注意要用英文的题目。选择箭头所指就可以显示python的解答方法。
   
那个代码长这样:
                      
        我直接拿去运行了一下,通过了。但是效果并不好,运行结果如下:

                   
        后来我看了一下最优解法的代码,结果竟然只是在这个基础上改了一点点,而时间效果竟差了很多。最优解的代码如下:
                      
        你没看错,就是把上面的那个代码中的ans = max(ans, area)这段代码改成用条件判断语句,舍弃了python自带的max()方法竟然可以提升这么大。对了,这一段代码的执行结果如下:
        
        时间从156ms,变到了72ms,不可思议,但是从这儿我又发现了一个问题。上面最优解的那个执行时间是52ms,而我用同样的代码去提交,时间还是72ms,我想执行时间应该还和电脑配置有关吧。


 

### LeetCode 积分获取方式 在 LeetCode 平台上,用户可以通过多种途径来增加自己的积分。完成每日目能够使用户的分数有所增长[^1]。例如,在提到的一个实例中,“今日得分:+10 总得分:240”,这表明通过解决特定问可以获得额外的积分奖励。 除了日常挑战外,参与周赛也是提升积分的有效手段之一。每周的比赛不仅考验参赛者的编程技巧,还提供了赢得更高排名的机会,从而带来更多的积分收益。不过需要注意的是,并未直接提及周赛的具体加分机制。 对于那些希望快速提高自己积分的人来说,专注于解答高难度的问可能是一个不错的选择。通常来说,越难的任务完成后所给予的经验值也会相应增多。然而具体每道目的确切分值并未在此处给出说明。 另外值得注意的是,持续活跃于社区讨论区也可能间接帮助个人积累更多积分。虽然这种活动本身并不直接贡献于积分系统,但是积极参与可以促进技能成长并发现更高效的解法路径,进而有助于更好地应对各类竞赛和练习中的难。 ```sql -- 这里提供了一个SQL查询的例子用于计算玩家留存率,而非直接关联到积分制度, -- 但展示了如何利用数据库操作分析平台上的行为数据。 SELECT ROUND(COUNT(DISTINCT player_id) / (SELECT COUNT(DISTINCT player_id) FROM Activity), 2) AS fraction FROM Activity WHERE (player_id, DATE_SUB(event_date, INTERVAL 1 DAY)) IN ( SELECT player_id, MIN(event_date) FROM Activity GROUP BY player_id); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大骨熬汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值