LeetCode每日一題 盛水容器 雙指標

2021-10-23 13:00:27 字數 1353 閱讀 1018

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

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

1. 暴力法

首先還是用簡單的思路來解答,這個題簡答的可以化解為求面積最大的長方形面積,而長方形的高是兩個數值之中的較小值,寬是兩個數值的指標的相差,為了主程式看起來簡單,我們可以設定兩個比較簡單的,由於要兩次遍歷,所以時間複雜為o(n2)**如下:

[

func

maxarea

(height [

]int

)int

}return finalout

}func

min(a,b int

)int

else

}func

max(a,b int

)int

else

}

2.雙指標

仔細看剛剛那個演算法,其實是列舉出了所有的長方形方塊,然後取最大值,那麼有沒有可以優化器演算法的能力呢? 有的。如果我們無須列舉所有的方塊,就可以等到最優解

其實這個盛水容器的問題,其根本在於每提高一次的高度和每減少一次的寬度之間的,帶來的面積變化問題,所以,有一些高度沒有發生改變,但長度變小的方塊,就沒有必要列舉了。

舉個例子,如圖所示中,較小的方塊很明顯不會大於較大的方塊,換句話說,當最低邊框不變時,以此邊框為高的最大長方形也就被限定了。

所以,我們只需要將兩邊的數字向中間推進即可,也就是如圖中紅,綠,橙,黑四色變換的四個框,計算量比之前的窮舉就節約下了很多。

具體**如下:

func

maxarea

(height [

]int

)int

else

finalout =

max(finalout,temp)

if b==a

}return finalout

}func

max(a,b int

)int

else

}

每日一題 Leetcode11 盛最多水的容器

2021 3 9 今天的每日一題是leetcode11.盛最多水的容器,這道題曾經在某個熱身賽裡碰到過,當時想錯了就沒做出來,現在看到真是感慨良多。題意如下 給你 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai ...

LeetCode每日一題 003 盛最多水的容器

想法一 盛水最多,即左右兩邊中間區域的矩形面積最大,稱左側為a邊,右側為b邊。比較直觀的解法是,固定某一邊 如a邊 依次比較b邊選取哪乙個所框住區域面積最大。因此,可以比較選取不同a邊所能框住面積的最大值,從而得到所有可能情況的最大值,及窮舉法。可通過雙層迴圈求解。想法二 在想法一基礎上,思考固定a...

每日一刷 LeetCode 11盛水最多的容器

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