• 最多水容器(M)


    题目

    给定n个非负整数12,...,n,其中每个代表坐标(ii处的一个点绘制n条垂直线,使得线i的两个端点处于(ii)和(i,0)处。找到两条线,它们与x轴一起形成一个容器,使得容器包含最多的水。

    注意:你可能不倾斜容器,n至少为2。

    实现:

    先看我的实现代码:

    class Solution {
        public int maxArea(int[] height) {
            int area = 0;
            for(int i=0; i<height.length-1; i++){
                for(int j=i+1; j<height.length; j++){
                    area = Math.max(area, Math.min(height[i], height[j])*(j-i));
                }
            }
            return area;
        }
    }
    

    为了找出最大面积,我的实现方法做了两次循环,所以,方法虽然是对的,但是时间超限。

    下面看一个乍一看不对,但是仔细理解却是对的的实现方式,leetcode讨论区的:

    public int maxArea(int[] height) {
        int left = 0, right = height.length - 1;
    	int maxArea = 0;
    
    	while (left < right) {
    		maxArea = Math.max(maxArea, Math.min(height[left], height[right])
    				* (right - left));
    		if (height[left] < height[right])
    			left++;
    		else
    			right--;
    	}
    
    	return maxArea;
    }
    

    以上这个方法只进行了一次遍历,不仔细考虑是会觉得这个方法是个错误方法,但是它却通过了,百思不得其解。

    经过思考,是这样解释的:

    限制这个容器容量的,除了底边长度,就是短边长度了,那么只需要每次改变短的那个边,保留长的那个边,那么上边的方法最后一定是一个会找到一个最长的边,以及其边上的边,这样实际上减少了遍历,但是理论上也找全了所有可能。

  • 相关阅读:
    javascript零散要点收集
    javascript闭包,arguments和prototype
    javascript面向对象规则汇总以及json
    递归转非递归的编程思想
    汇编要点汇总
    队列相关算法
    深度优先遍历算法
    C++面向对象要点
    堆排序
    快速排序算法
  • 原文地址:https://www.cnblogs.com/K-artorias/p/7886832.html
Copyright © 2020-2023  润新知