• 11 盛最多水的容器(LeetCode HOT 100)


    描述:
    给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

    找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

    返回容器可以储存的最大水量。

    说明:你不能倾斜容器。

    示例 1:

    输入:[1,8,6,2,5,4,8,3,7]
    输出:49 
    解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
    

    示例 2:

    输入:height = [1,1]
    输出:1
    

    提示:
    n == height.length
    2 <= n <= 10 5
    0 <= height[i] <= 10 4

    Soulution:

    /**
         * 双指针解法
         *
         * @param height 
         * @return int
         */
        public static int maxArea(int[] height) {
            int i = 0;
            int j = height.length - 1;
            int maxArea = 0;
            while (i < j) {
                int minHeight;
                if (height[i] < height[j]) {
                    minHeight = height[i];
                    ++i;
                } else {
                    minHeight = height[j];
                    --j;
                }
                int tempArea = (j - i + 1) * minHeight;
                if (maxArea < tempArea) {
                    maxArea = tempArea;
                }
            }
    
            return maxArea;
        }
    

    Idea:
    短板效应:
    在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 -1变短:
    若向内 移动短板 ,水槽的短板 min(h[i], h[j]) 可能变大,因此下个水槽的面积 可能增大
    若向内 移动长板 ,水槽的短板 min(h[i], h[j]) 不变或变小,因此下个水槽的面积 一定变小
    所以,可以使用i,j,分别从两端向中间遍历,最终时间复杂度为O(n)。

    Reslut:

    双指针其实是利用数组(或者求解问题)的有序特性,在遍历的过程中使用两个相同方向或者相反方向的指针进行扫描,从而达到目的的一种算法。

  • 相关阅读:
    .Net编程接口中的迭代器(转)
    微软,您的.net为中国程序员带来了什么?(转)
    二进制,八进制,十进制,十六进制转换
    简单实现SQL Server2000数据库缓存
    联合查询
    也谈用反射实现Enum→String映射:一种重视性能的方法 (转)
    javascript事件列表解说(转)
    ASP.NET上传控件
    杂杞
    在.net中生成wml
  • 原文地址:https://www.cnblogs.com/supermingjun/p/16114516.html
Copyright © 2020-2023  润新知