携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/co…
分析
根据题目描述确定方法——用什么思路或者方法来解决
- 题目已经告诉的很明确了,最大水量与两条线相关,而且给出的参数是一个数组,数组天然的优势是有下标,两个下标相减,就能得到容器的宽,然后乘上容器的高就能得到存水量。容器的高就是由这两条线确定的。分析之后能比较容易的想到使用双指针。通过移动指针位置,得到存水量,然后选最大的那个存水量就是题目的答案。
根据方法指定策略——确定了双指针之后,具体移动的策略是什么
- 开始状态是两个指针分别指向数组的首尾,分别向中间移动,当指针相遇的时候,移动过程结束,从而得出答案
- 每次移动指向较小值的那个指针
- 为什么要移动那个指向较小值的指针?这个地方处理的思想比较偏向于博弈
- 指针L和R,分别指向M和N,假设M<N。如果这个时候移动R,得到的新值X,当X>M时,容器的高还是M,但是L和R的间距减小了,此时得到的存水量必然小于移动之前的存水量。当X<M时,容器的高变得更小,LR之间的间距也减小了,此时的存水量也小于移动之前的存水量。但是如果移动L,得到新值X,当X<N时,容器高是N,当X>N时,容器的高是X,无论高是X还是N,都比之前的高大,宽度虽然减小,但是乘出来的结果可能比之前的高,所以这样移动就更容易找到最大的存水量。
代码
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function(height) {
let ans = 0;
let len = height.length;
let h = 0;
let t = len-1;
while(h < t) {
ans = Math.max(ans, Math.min(height[h], height[t]) * (t-h));
height[h] <= height[t] ? h ++ : t --;
}
return ans;
};
总结
- 当想要提升自己的时候,不妨试试改变下自己差的部分,其余的保持住,有可能会得到更好的自己
- 今天又是有收获的一天