--算法恩仇录--实战篇--力扣(LeetCode)--011-盛水最多的容器--
这道题纯暴力枚举的复杂度是O(n^2),显然还可以最优。
如果需要优化应该在哪里优化?
需要在遍历的环节进行优化,那么应该如何遍历?
因为我们所计算面积,为两板间较小的那块高度*两板间的距离
所以我们可以从数组的头和尾,两边开始遍历。
每次遍历结束,舍弃较小的那块板子。因为两板间的距离固定-1,所以舍弃较小的那块板子,换取遍历下一块大板子的机会。
代码如下:
/** * @param {number[]} height * @return {number} */ var maxArea = function(height) { let h = height; let l = 0, r = h.length - 1; let ans = 0; for(;l < r;){ //console.log("L:->", l, " R:->", r); let area = Math.min(h[l], h[r]) * (r - l); if(ans <= area){ ans = area; } if(h[l] < h[r]){ l++; } else { r--; } } return ans; };
最后结果为:
执行用时:108 ms, 在所有 JavaScript 提交中击败了32.82%的用户
内存消耗:38.5 MB, 在所有 JavaScript 提交中击败了76.45%的用户
这道题提供了一个很好的思路,供自己思考。当时自己考虑这道题,知道需要优化遍历,但没想到如何进行优化遍历。
emmm,时间和空间之所以相对大佬们较低,是因为自己的代码重新将height数组赋值给了h数组,并非思路问题。
离大侠再近一步!