关于Container With Most Water的求解

Container With Most Water

哎,最近心情烦躁,想在leetcode找找感觉,就看到了这题。
然而,看了题目半天,硬是没看懂,于是乎就百度了下,怕看到解题方法,就略看了下摘要,以为懂了,万万没想到,居然把题目意思理解错了,所以还是要好好学英语呀。
然而,在理解对了之后,又是time limit excess,又瞟了下博客讲解,也算是徒手码了出来,记录一发,随便再体会下....

题目相关

题目在这,Container With Most Water
大概意思就是,给出的各点作x轴垂线,与x轴组成一个Container,然后找出两条线,使得其能储存最大容量的水,哎,其实仔细看题目,人家表述的很清楚呀,好好学英语呀...

思路一

正确理解题目了之后,按照我等弱鸡智商当然是第一反应是遍历了,很简单,两边两块板,容量为:

min*(j-i)

选取一边作为基准,遍历其后面的所有边,与之形成容器,得到各个容量。
两个循环就行...
好久没用js了,就熟悉下。

Algorithm = {};

Algorithm.private = {};

Algorithm.private.GetArea = function (height, i, j) {
    var min = 0;
    if (height[i] > height[j]) {
        min = height[j];
    } else {
        min = height[i];
    }
    return min * (j - i);
}

Algorithm.ContainerWater = function (height) {

    var maxArea = 0;
    for (var i = 0; i < height.length; i++) {
        for (var j = i; j < height.length; j++) {
            var t = Algorithm.private.GetArea(height, i, j)
            if (maxArea < t) {
                maxArea = t;
            }
        }
    }
    return maxArea;
}

毫无疑问,时间超时,不过好歹也能工作吧.....

思路二

看了下别人的思路,原来,还可以这样
最终找到了两条线应该具备以下两个性质

  • 左边的线的左边不会有比其更长的线
  • 右边的线的右边不会有比其更长的线

其实很好理解,如果所找到的结果不满足这两条性质,那这结果必然不是最优的,也即是说,上面两点是必要条件,由此,得到以下代码...

Algorithm.ContainerWaterOpt = function (height) {

    var a = [], b = [], amax = 0, bmax = 0, maxArea = 0;
    for (var i = 0; i < height.length; i++) {
        if (amax < height[i]) {
            amax = height[i];
            a.push(i);
        }
        if (bmax < height[height.length - i - 1]) {
            bmax = height[height.length - i - 1];
            b.push(height.length - i - 1);
        }
    }

    for (var i = 0; i < a.length; i++) {
        for (var j = 0; j < b.length; j++) {
            var t = Algorithm.private.GetArea(height, a[i], b[j]);
            if (maxArea < t) {
                maxArea = t;
            }
        }
    }

    return maxArea;
}

后记

哎,以后做题时,还是好好思考题目本身里面的内涵,不一定非要从数据结构等来思考...
最最重要的,好好学英语呀!

posted @ 2016-12-04 21:44  Rainlin  阅读(199)  评论(0编辑  收藏  举报