• leetcode面试准备:Container With Most Water


    leetcode面试准备:Container With Most Water

    1 题目

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) 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.
    接口: public int maxArea(int[] height);

    2 思路

    题意

    在二维坐标系中,(i, ai) 表示 从 (i, 0) 到 (i, ai) 的一条线段,任意两条这样的线段和 x 轴组成一个木桶,找出能够盛水最多的木桶,返回其容积。

    解法

    两层 for 循环的暴力法会超时。

    有没有 O(n) 的解法?

    答案是有,用两个指针从两端开始向中间靠拢,如果左端线段短于右端,那么左端右移,反之右端左移,知道左右两端移到中间重合,记录这个过程中每一次组成木桶的容积,返回其中最大的。(想想这样为何合理?)
    把实例{ 4, 6, 2, 6, 7, 11, 2 }走一遍,可以明白。
    复杂度: Time:O(n) Space:O(1)

    3 代码

    	/*
    	 * 两边夹逼
    	 * Time:O(n) Space:O(1)
    	 */
    	public int maxArea(int[] height) {
    		int len = height.length;
    		int left = 0, right = len - 1;
    		int res = 0;
    		while (left < right) {
    			int local = Math.min(height[left], height[right]) * (right - left);
    			res = Math.max(res, local);
    			if (height[left] < height[right]) {
    				left++;
    			} else {
    				right--;
    			}
    		}
    		return res;
    	}
    

    4 总结

    Two Pointer思想

  • 相关阅读:
    批处理命令之实现修改环境变量的值
    【hihocoder 1304】搜索一·24点
    【hihocoder 1297】数论四·扩展欧几里德
    【hihocoder 1298】 数论五·欧拉函数
    【hihocoder 1303】模线性方程组
    C语言如何动态分配二维数组
    Istream中的函数
    string 与 char * 转换
    boost 系列 1:boost 直接使用
    glog功能介绍 一分钟 51CTO技术博客
  • 原文地址:https://www.cnblogs.com/byrhuangqiang/p/4794938.html
Copyright © 2020-2023  润新知