前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode - 盛最多水的容器

LeetCode - 盛最多水的容器

作者头像
晓痴
发布2019-09-19 14:54:14
3730
发布2019-09-19 14:54:14
举报
文章被收录于专栏:曌的晓痴曌的晓痴

LeetCode第11题,难度中等,严重怀疑该题在英文版里是不是第11题,一点印象都没有.

原题地址:https://leetcode-cn.com/problems/container-with-most-water/

题目描述

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/container-with-most-water

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

看到这题,第一反应就是,一个个坐标遍历过去,分别算出最大的容积,然后取最大值。这个就是暴力解法。

我的解法是,遍历所有的可能性,然后分别求出当前的高度,并计算容积,最后取最大值。

很明显暴力解法是很慢的,因为有很多无用的循环比较在其中。更快的方法也有,就是双指针法。

双指针法的思路就是在头尾各放置一个指针,然后获取当前的容积。然后怎么移动指针呢?将高度更小的指针往中心移动,也就是左指针向右,右指针向左。为什么这么做?是因为高度和长度是制约容积的两大因素,如果容积受限于高度,就应该想办法去获取更高的高度,虽然长度可能会有损失。

双指针法的话,只需要遍历一遍数组就好了,很明显更高效。

中文官网题解:

https://leetcode-cn.com/problems/container-with-most-water/solution/

个人题解:

func maxArea(height []int) int {
  max := 0
  for i := 0; i < len(height); i++ {
    for j := i + 1; j < len(height); j++ {
      var h int
      if height[i] >= height[j] {
        h = height[j]
      } else {
        h = height[i]
      }
      if h*(j-i) > max {
        max = h * (j - i)
      }
    }
  }
  return max
}

结果:

没想到运行了1000多毫秒之后,我仍然不是垫底的,但是距离前面太远了.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 曌的晓痴 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档