• [leecode]---11.container with most water


    description:

     

    Input: [1,8,6,2,5,4,8,3,7]Output: 49


    思路
    1

      从(1,a1)开始向后算面积,需要两层n循环,时间复杂度n2

    思路2

      找出数组中最大的数,将其与次大,第三大数求面积,依次类推,也需要两层循环,还需要额外排序,时间复杂度n2

      因为找出最大数并且并不知道输入数据的规律(有可能很杂乱),所以每个都有必要算,采取思路1.

      代码实现如下:

    class Solution {
        public int maxArea(int[] height) {
            int max = 0;
            for(int i = 0; i < height.length; i++){
                int mid = maxSpare(height, i);
                max = max >= mid ? max : mid;
            }
            return max;
        }
        // 从index = start开始向后对每一对求面积
        private int maxSpare(int[] height, int start){
            int maxArea = 0;
            for(int i = start + 1; i < height.length; i++){
                int area = countArea(height[start], height[i], i - start);
                maxArea = maxArea > area ? maxArea : area;
            }
            return maxArea;
        }
        private int countArea(int height1, int height2, int width){
            int result = 0;
            int height = height1 > height2 ? height2 : height1;
            result = height * width;
            return result;
        }
    }

    but only faster 15.40% of Java online submissions for Container With Most Water.

    讨论区看见O(n)的算法:

    (1)left = 0, right = n-1,计算left~right之间的面积

    (2)若left的高度小于right的高度,则查找2~n-1之间大于left的位置,更新left,计算面积;否则,查找中间大于right高度的位置,作为新right,计算面积

    (3)直到right< left

    思考:

      设以left=1为基点不变,找到一个right值,使left~right之间的矩形面积最大,则存在以下三种情况:

    aleft > aright

     

      此时高度height=arightwidth=n-1),所求面积可能小于等于a1为左边的最大面积。

    aright为右边起第一个大于等于aleft的边,设right=n-1

     

      此时height=aleftwidth= (n-1)-1,面积有可能等于为以a1为左边的最大面积。

    aright为右边起第一个大于等于aleft的边,设right=n-2

     

      此时虽然height=aleft,但是width=(n-2)-1小于②中的width,所以③中求得的面积小于②中的面积,即③中的情况是不考虑的

      所以可以两头推进。参考如下代码:

    class Solution {
        public int maxArea(int[] height) {
            int max = 0, left = 0, right = height.length-1;
            while(left < right){
                int area = Math.min(height[left],height[right]) * (right - left);
                max = max > area ? max : area;
                if(height[left] < height[right]){
                    int base = height[left];
                    while((height[left] <= base) && (left < right)){
                        left++;
                    } // end while
                }
                else{
                    int base = height[right];
                    while((height[right] <= base) && (left < right)){
                        right--;
                    } // end right
                } // end if-else
            } // end while
            return max;
        } // end maxArea
    }
    Runtime: 7 ms, faster than 55.28% of Java online submissions for Container With Most Water.

    算法很重要 

    一个3ms的代码:

    class Solution {
      public int maxArea(int[] height) {
        int maxarea = 0;
        int temparea = 0;
        int i = 0;
        int j = height.length -1;
        while(i < j) {
          if(height[i] <= height[j]) {
            temparea = height[i] * (j-i);
            i++;
          }
          else {
             temparea = height[j] * (j-i);
             j--;
          }
          if(temparea > maxarea) {
             maxarea = temparea;
          }
        }
        return maxarea;
      }
    }
  • 相关阅读:
    一、javaSE (十三)StringBuffer类、数组高级以及 Arrays类、Integer类、Character类
    一、javaSE (十二)scanner的使用、 String类的概述和使用
    一、javaSE (十一)objest类
    一、javaSE (十)形参和返回值、包、导包、权限修饰符、常见修饰符、内部类
    一、javaSE (九)final、多态、抽象类、接口
    一、javaSE (八)类的继承、方法重写
    一、javaSE (七)类的封装、关键字
    JBOSS7搭载EJB3之消息驱动Bean
    JBOSS7搭载EJB3之实体Bean
    jboss7搭载EJB3之简单会话BEAN与依赖注入jboss数据源
  • 原文地址:https://www.cnblogs.com/datamining-bio/p/10011544.html
Copyright © 2020-2023  润新知