拿來吧你!⚡考研面試⚡天天練—— (短板原理巧解)盛最多水的容器

這是我參與 8 月更文挑戰的第 9 天,活動詳情查看: 8月更文挑戰java

🚺題目

給你 n 個非負整數 a1,a2,...,an,每一個數表明座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0) 。找出其中的兩條線,使得它們與 x 軸共同構成的容器能夠容納最多的水。python

說明:你不能傾斜容器。數組

示例 1: 在這裏插入圖片描述markdown

輸入:[1,8,6,2,5,4,8,3,7]
輸出:49 
解釋:圖中垂直線表明輸入數組 [1,8,6,2,5,4,8,3,7]。在此狀況下,容器可以容納水(表示爲藍色部分)的最大值爲 49複製代碼
示例 2:

輸入:height = [1,1]
輸出:1
複製代碼
示例 3:

輸入:height = [4,3,2,1,4]
輸出:16
複製代碼
示例 4:

輸入:height = [1,2,1]
輸出:2
 
複製代碼
提示:

n = height.length
2 <= n <= 3 * 104
0 <= height[i] <= 3 * 104
經過次數497,423提交次數785,189
複製代碼

🚺一點點思路

看到這道題我一下感受刷題沒白刷啊,想一想前幾天咱們一塊兒作的《無重複字符的最長子串》咱們當時用的是雙指針模擬了滑動窗口機制還記的嗎?不記得不要緊在回頭看看就好了,這道題不知道你們有沒有據說過短板原理連接我想用這個原力來解決問題在每次指針移動的時候咱們只要移動短板就行了。來吧咱們來看看此次的題解。dom

🚺開幹

🚺介紹一種函數

由於今天所用到的知識和之前很像因此咱們就回顧之前的Math函數的知識吧函數

Math.PI 記錄的圓周率
Math.E 記錄e的常量
Math中還有一些相似的常量,都是一些工程數學經常使用量。
Math.abs 求絕對值
Math.sin 正弦函數 Math.asin 反正弦函數
Math.cos 餘弦函數 Math.acos 反餘弦函數
Math.tan 正切函數 Math.atan 反正切函數 Math.atan2 商的反正切函數
Math.toDegrees 弧度轉化爲角度 Math.toRadians 角度轉化爲弧度
[color=red]Math.ceil 獲得不小於某數的最大整數 比它大的數[/color]
[color=red]Math.floor 獲得不大於某數的最大整數 比它小的數[/color]
Math.IEEEremainder 求餘
Math.max 求兩數中最大
Math.min 求兩數中最小
Math.sqrt 求開方
[color=red]Math.pow 求某數的任意次方, 拋出ArithmeticException處理溢出異常[/color]
Math.exp 求e的任意次方
Math.log10 以10爲底的對數
Math.log 天然對數
Math.rint 求距離某數最近的整數(可能比某數大,也可能比它小)
[color=red]Math.round 求距離某數最近的整數,返回int型或者long型(上一個函數返回double型)[/color]
Math.random 返回01之間的一個隨機數

複製代碼

🚺源碼和分析過程

根據短板原理咱們能夠知道這個容器能盛水多少,主要是看這個容器兩邊的高度height[i]&&height[j]其實這裏咱們還須要注意的是在移動height[i]&&height[j]最小的一個的時候它的底邊長度也會縮小的。oop

class Solution {
    public int maxArea(int[] height) {
    //設定i在左邊j在右邊
        int i = 0, j = height.length - 1, res = 0;
        //當容器兩邊處在同一位置的時候容器的底邊就爲零了這個時候就能夠終止了
        while(i < j){
            res = height[i] < height[j] ? Math.max(res, (j - i) * height[i++]): Math.max(res, (j - i) * height[j--]); 
        }
        return res;
    }
}

複製代碼

接下來咱們再來看看這個post

res = height[i] < height[j] ? Math.max(res, (j - i) * height[i++]): Math.max(res, (j - i) * height[j--]); 
複製代碼

你們要是分不清i++++i記得私聊我,或者留言我給你補補。這句代碼的主要意思就是找每一個小的height[i]&&height[j]若是小的是height[i]就向右邊移動i++另外一邊也是一樣的道理。而後在和原來的數比較若是比原來的res大就換掉。 好了今天的練習就到這裏了哦。明天再見。spa

相關文章
相關標籤/搜索