盛最多水的容器

2021-10-02 09:58:07 字數 1500 閱讀 3763

給定 n 個非負整數 a1,a2,…,an,每個數代表座標中的乙個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

說明:你不能傾斜容器,且 n 的值至少為 2。

首先我看到這個題目,沒啥思路,也沒有乙個很好的切入點,一開始想的是使用雙視窗,因為這題的本質就是確定兩個點嘛,那麼我就想著使用滑動視窗,然後這個視窗就表示面積最大的兩個點,但是最後證實是不可行的,其中的原因有:新加入的點不單單與視窗的start位置能組成最大矩形面積,與視窗中的各個點也都有可能組成最大矩形面積,所以滑動視窗的思路並不能使用

接下來我觀察例項,發現乙個規律:新加入的點如果比當前組成最大矩形面積的兩個點中的第乙個點小,那麼只需要比較新加入點與第乙個點組成的矩形面積與當前最大矩形面積相比較即可,舉個例子:

例如,目前矩形最大面積由8和6兩個點構成,此時矩形最大面積為6,當新加入2時,因為比8小,所以我們只需要比較8和2構成的矩形面積和6相比較,當大於時,那麼更新矩形最大面積,否則繼續遍歷下乙個點(為什麼當新加入點比第乙個點小就只需要比較兩個矩形面積的大小,理由如下:當新加入點比第乙個點小時,例如2小於8,那麼8的下乙個點如果比2大,如6,因為矩形面積都是以短的邊長作為高,所以只要比2大,那麼高都是2,但是你的底減小了;當8的後面的點比2小時,那麼你的矩形的高和底相比較來說都減小了,所以總的來說,當新加入的點比此時矩形最大面積構成的那兩個點的第乙個點小時,我們只需要比較新的矩形和此時矩形最大面積的大小即可)

那麼對於新加入點大於第乙個點的情況怎麼解決呢?當時我是這樣解決的:矩形裡面的所有點與新加入點分別構成不同的矩形,取最大的那個矩形,**如下:

int maxarea(vector& height) 

else

t++;

}t = x;

}i++;

} return result;

}

結果示例是通過了,但是對於數量很多的例項卻不能得到正確答案,因為對於vector中元素數量很多的例子,因為數量太多,所以也不能除錯,所以我也不懂錯誤在**,但是理了一遍思路,發現確實值得推敲,也不值得推敲,可能也不是一種好的辦法

3. 接下來就想到了:可不可以從兩端往內收縮(因為曾經有思路是利用遞迴,從中間向兩端擴散,發現這種思路也不正確),直接上**:

int maxarea(vector& height) 

else

min = height[i] > height[t] ? t : i;//當出現較大的邊時,便更新min值

if ((t - i) * height[min] > result)

result = (t - i) * height[min];

} return result;

}

總結:矩形面積等於底x高,那麼我們向中間收縮的過程中,相當於底邊減小,那麼要想矩形的面積變大,那麼你只能尋找高變大的那乙個才有可能實現矩形面積增大

盛最多水的容器

給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。注意 你不能傾斜容器,n 至少是2。乍一看很簡單,巢狀迴圈遍歷就完事了 int m...

盛最多水的容器

題目描述 給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水 說明 你不能傾斜容器,且 n 的值至少為 2。示例 輸入 1,8,6...

盛最多水的容器

給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。說明 你不能傾斜容器,且 n 的值至少為 2。圖中垂直線代表輸入陣列 1,8,...