• [LeetCode] Container With Most Water


    Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

    Note: You may not slant the container.

    解题思路:

    最直接的尝试是暴搜,o(n2)的时间复杂度,结果TLE。于是不得不寻找更高效的解法。

    面积的计算area = min(height[i], height[j]) * |i - j|。可以考虑控制变量,对于i,j之间的line而言,他们的底一定小于|i - j|,那么如果他们的面积要大,就必须有更高的高度。

    因此,对于i, j,不妨假设height[i] < height[j],那么如果选取i,而变化j,那么对于height[k] > height[i]的而言,它的高依然是height[i],但是底变小了,所以area不如i,j。对于height[k] < height[i]的,它的area更不可能有更大的出现,于是这种情况下更好的情况必然是不包含i,于是i++。反过来,如果height[i] > height[j],更好的解一定不包含j,于是j--。那么如果height[i] = height[j]呢?更好的情况一定是i和j最后都移动了,此时先移动谁,后移动谁没有关系。

    class Solution {
    public:
        int maxArea(vector<int> &height) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            /* o(n * n) solution, TLE
            if(height.size() == 0) return 0;
            int m = 0;
            for(int i = 0;i < height.size();i++)
            {
                for(int j = i + 1;j < height.size();j++)
                {
                    int h = min(height[i], height[j]), w = j - i;
                    m = max(m, h * w);
                }
            }
            return m;
            */
            if(height.size() == 0) return 0;
            int max_area = 0, i = 0, j = height.size() - 1;
            while(i < j)
            {
                max_area = max(max_area, (j - i) * min(height[i], height[j]));
                if(height[i] < height[j]) i++;
                else j--;
            }
            return max_area;
        }
    };
  • 相关阅读:
    suseoj 1211: 子集和问题 (dfs)
    suseoj 1210: 会场安排问题 (贪心)
    suseoj 1209: 独立任务最优调度问题(动态规划)
    四级词汇(二)
    四级单词(一)
    nyoj 84-阶乘的0 (规律题)
    nyoj 83-迷宫寻宝(二) (计算几何, 叉积)
    nyoj 82-迷宫寻宝(一) (多重BFS)
    nyoj 79-拦截导弹 (动态规划)
    nyoj 78-圈水池 (凸包)
  • 原文地址:https://www.cnblogs.com/changchengxiao/p/3420870.html
Copyright © 2020-2023  润新知