每天一道LeetCode-----平面木桶最大容量,以较小的纵坐标为高,横坐标差为底
原題鏈接Container With Most Water
意思是有n個坐標點,橫坐標是索引,縱坐標給出,從每個點向x軸做垂線,求最大面積
蠻力法將所有情況都判斷一遍復雜度在O(n2),兩層for循環。
優化的話,可以考慮使用動態規劃,dp[i][j]表示從i到j這個范圍最大的面積,但是后來發現仍然復雜度過高,看了答案發現自己好蠢。。。
首先還是先看動態規劃把,然后在這個基礎上進行優化。
dp含義如上,假設當前位置在i, j,所以dp[i][j]有以下幾種取值
后兩個就是動態向中間縮,然后dp[i][j]的值其實就是這三個中的最大那個。
然而,考慮一個問題,假設height[i] < height[j],那么dp[i][j - 1]永遠是小于(j - i) * min(height[i], height[j])的,原因是所求面積是以較小的height為高,既然height[i]小,那么固定i,將j向內收縮,收縮的過程中有兩種情況
所以這種情況就不在需要考慮,只需要考慮dp[i + 1][j]和(j - i) * min(height[i], height[j])的大小。
所以流程大致如下
這樣只需要遍歷一遍height即可,復雜度降低到O(n)。不過這樣也就沒必要用動態規劃了,一個for循環解決戰斗
class Solution { public:int maxArea(vector<int>& height) {int max_area = 0;int front = 0;int back = height.size() - 1;while(front < back){max_area = std::max(max_area, (back - front) * std::min(height[front], height[back]));if(height[front] > height[back]){--back;}else {++front;}}return max_area;}};哎,恨剛開始用動態規劃的自己
總結
以上是生活随笔為你收集整理的每天一道LeetCode-----平面木桶最大容量,以较小的纵坐标为高,横坐标差为底的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----回文链
- 下一篇: 每天一道LeetCode-----删除链