We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
原题链接
虽然是中等难度,但这道题解起来还是比较简单的,老规矩,我们看下符合第一直觉的暴力法:
幼儿园数学题:矩形面积 = 长 * 宽
放到我们这道题中,矩形的长和宽就分别对应:
双重 for 循环遍历所有可能,记录最大值。
const maxArea = function(height) { let max = 0 // 最大容纳水量 for (let i = 0; i < height.length; i++) { for (let j = i + 1; j < height.length; j++) { // 当前容纳水量 let cur = (j - i) * Math.min(height[i], height[j]) if (cur > max) { max = cur } } } return max }
暴力法时间复杂度 O(n^2) 太高了,我们还是要想办法进行优化。
我们可以借用双指针来减少搜索空间,转换为双指针的视角后,回顾矩形的面积对应关系如下:
(矩形面积)容纳的水量 = (两条垂直线的距离)指针之间的距离 * (两个指针指向的数字中的较小值)两条垂直线中较短的一条的长度
设置两个指针,分别指向头和尾(i指向头,j指向尾),不断向中间逼近,在逼近的过程中为了找到更长的垂直线:
有点贪心思想那味儿了,因为更长的垂直线能组成更大的面积,所以我们放弃了较短的那一条的可能性。
但是这么做,我们有没有更能漏掉一个更大的面积的可能性呢?
先告诉你答案是不会漏掉。
关于该算法的正确性证明已经有很多同学们给出了答案,感兴趣的请戳下面链接。
const maxArea = function(height) { let max = 0 // 最大容纳水量 let left = 0 // 左指针 let right = height.length - 1 // 右指针 while (left < right) { // 当前容纳水量 let cur = (right - left) * Math.min(height[left], height[right]); max = Math.max(cur, max) height[left] < height[right] ? left ++ : right -- } return max };
The text was updated successfully, but these errors were encountered:
No branches or pull requests
原题链接
虽然是中等难度,但这道题解起来还是比较简单的,老规矩,我们看下符合第一直觉的暴力法:
暴力法
幼儿园数学题:矩形面积 = 长 * 宽
放到我们这道题中,矩形的长和宽就分别对应:
双重 for 循环遍历所有可能,记录最大值。
暴力法时间复杂度 O(n^2) 太高了,我们还是要想办法进行优化。
双指针
我们可以借用双指针来减少搜索空间,转换为双指针的视角后,回顾矩形的面积对应关系如下:
(矩形面积)容纳的水量 = (两条垂直线的距离)指针之间的距离 * (两个指针指向的数字中的较小值)两条垂直线中较短的一条的长度
设置两个指针,分别指向头和尾(i指向头,j指向尾),不断向中间逼近,在逼近的过程中为了找到更长的垂直线:
有点贪心思想那味儿了,因为更长的垂直线能组成更大的面积,所以我们放弃了较短的那一条的可能性。
但是这么做,我们有没有更能漏掉一个更大的面积的可能性呢?
先告诉你答案是不会漏掉。
关于该算法的正确性证明已经有很多同学们给出了答案,感兴趣的请戳下面链接。
The text was updated successfully, but these errors were encountered: