--算法恩仇录--实战篇--力扣(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数组,并非思路问题。
posted @ 2020-09-02 11:39  小虾米在code江湖  阅读(154)  评论(0编辑  收藏  举报