1. 程式人生 > >存水&&柱子間最大體積

存水&&柱子間最大體積

多少 index ++ public tar get align 最大 code

存水

給定一個數組,看做容器,求可以存儲的水的體積

Arr = {3,1,3} à 可以存2

Arr = {1,2,3,4,2,1} à 可以存1

算法解析:

  1. 以單個元素來看,位於其頂部的水的體積為左右兩側最大值集合中的最小一項減去其位置的高度的值,對其所有元素進行計算即可求出
  2. 左右兩側設置最大值,從頭尾開始遍歷,設定leftMax與rightMax, 若是leftMax<rightMax,說明右側元素是否可以存水及存多少看左邊的值(木桶原理),反之亦然

    public int getWater1(int[] arr){
        int val = 0;
        
int leftMax = arr[0]; int rightMax = arr[arr.length-1]; int leftIndex = 1; int rightIndex = arr.length-2; while(leftIndex<=rightIndex){ //此處需要註意是 <= if(leftMax<rightMax){ val += Math.max(0, leftMax-arr[rightIndex]); rightMax
= Math.max(rightMax, arr[rightIndex--]); }else{ val += Math.max(0, rightMax-arr[leftIndex]); leftMax = Math.max(leftMax, arr[leftIndex++]); } } return val; }

柱子間最大面積

給定一個數組,看做每個元素為柱子高度,寬度默認為1

求其兩根柱子間可以圍出的最大面積

Arr = {3,1,2,4} à 3*2 = 6

算法解析:

  1. 左右兩側開始遍歷,較小的會影響所求的面積
    public int getArea(int[] arr){
        int max;
        int leftIndex = 0;
        int rightIndex = arr.length-1;
        max = Math.min(arr[leftIndex],arr[rightIndex])*(rightIndex-leftIndex-1);
        while(leftIndex<rightIndex){
            if(arr[leftIndex]<arr[rightIndex]){
                max = Math.max(max, 
                        Math.min(arr[++leftIndex], arr[rightIndex])*(rightIndex-leftIndex-1));
            }else{
                max = Math.max(max,
                        Math.min(arr[--rightIndex],arr[rightIndex])*(rightIndex-leftIndex-1));
            }
        }
        return max;
    }

存水&&柱子間最大體積