zoukankan      html  css  js  c++  java
  • --算法恩仇录--实战篇--力扣(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数组,并非思路问题。
    离大侠再近一步!
  • 相关阅读:
    Tomcat配置JNDI
    (转)通过反编译深入理解Java String及intern
    (转)Java8内存模型-永久代(PermGen)和元空间(Metaspace)
    排序算法
    并发编程
    MySQL
    Go语言
    Go语言
    Go语言
    Go语言
  • 原文地址:https://www.cnblogs.com/Samo-Li/p/13600904.html
Copyright © 2011-2022 走看看