算法题(力扣)--盛水最多的容器
题目描述:
给你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
我们都应该听说过木桶原理,一个木桶可以装入多少水取决于最短的那块板;而这道题也可以与木桶装水的问题对应上。 很容易的可以得到---->容器可以容纳水的容量=两条垂直线中最短的那条*两条线之间的距离 现在的情况是,有很多条线,让你计算两两之间能装的最多的水,其实暴力法之间就能解决这个问题,但是它的时间复杂度也达到了O(n^2)
ok,那我们先试试用暴力法来解 决问题:
1.暴力法
直接上代码:
暴力法是可以通过测试的,但是可以看到程序执行用时并不理想
执行用时 :440 ms, 在所有 Java 提交中击败了17.44% 的用户
内存消耗 :39.9 MB, 在所有 Java 提交中击败了37.86%的用户
2.双指针
思路:使用两个指针(resource和last)分别指向数组的第一个元素和最后一个元素,然后我们计算这两条“线”之间能容纳的水的容量,并更新最大容量(初始值为0);接着我们需要将指向元素值小的那个指针前移一步,然后重复上面的步骤,直到resource = last循环截止。
来看看代码:
可以很明显的看到,虽然内存消耗两者是差不多的,但是双指针的速度比暴力解法的速度可是高出好多倍。
时间复杂度:O(n) 空间复杂度:O(1)
执行用时 :3 ms, 在所有 Java 提交中击败了92.69% 的用户
内存消耗 :40.3 MB, 在所有 Java 提交中击败了7.86%的用户
相关推荐HOT
redis数据类型有几种
消息队列(stream):一个特殊的数据结构,用于支持流式处理消息,并可以支持消费者分组、消费者位移等特性。每种数据类型都有对应的命令可以进行...详情>>
2023-03-16 10:19:36hadoop集群的最主要瓶颈
Hadoop集群的主要瓶颈取决于许多因素,例如集群的大小、硬件规格、网络架构、数据复杂性和处理任务等。以下是可能影响Hadoop集群性能的一些常见...详情>>
2023-03-14 10:22:17java底层hashmap扩容怎么实现?
Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分...详情>>
2022-11-08 14:31:36用户画像系统中遇到的比较难的问题是什么?
如果我们直接将用户的标签转换为稀疏向量来存储,对于类别标签使用`one-hot`编码,但这样会出现维度爆炸的问题,向量过于稀疏,向量之间的余弦...详情>>
2022-11-07 15:25:17