日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每天一道LeetCode-----平面木桶最大容量,以较小的纵坐标为高,横坐标差为底

發布時間:2024/4/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天一道LeetCode-----平面木桶最大容量,以较小的纵坐标为高,横坐标差为底 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原題鏈接Container With Most Water

意思是有n個坐標點,橫坐標是索引,縱坐標給出,從每個點向x軸做垂線,求最大面積


蠻力法將所有情況都判斷一遍復雜度在O(n2),兩層for循環。
優化的話,可以考慮使用動態規劃,dp[i][j]表示從i到j這個范圍最大的面積,但是后來發現仍然復雜度過高,看了答案發現自己好蠢。。。


首先還是先看動態規劃把,然后在這個基礎上進行優化。
dp含義如上,假設當前位置在i, j,所以dp[i][j]有以下幾種取值

  • (j - i) * min(height[i], height[j]),這是將i和j作為兩個邊界,算出面積
  • dp[i + 1][j]
  • dp[i][j - 1]
  • 后兩個就是動態向中間縮,然后dp[i][j]的值其實就是這三個中的最大那個。
    然而,考慮一個問題,假設height[i] < height[j],那么dp[i][j - 1]永遠是小于(j - i) * min(height[i], height[j])的,原因是所求面積是以較小的height為高,既然height[i]小,那么固定i,將j向內收縮,收縮的過程中有兩種情況

  • 改變j后,height[j]仍然大于height[i],此時高沒有改變,依然是height[i],底邊卻減小了,面積肯定變小
  • 改變j后,height[j]小于height[i],此時高減小了,底邊也減小了,面積還是會變小
  • 所以這種情況就不在需要考慮,只需要考慮dp[i + 1][j]和(j - i) * min(height[i], height[j])的大小。

    所以流程大致如下

  • 從i, j開始,比較(j - i) * min(height[i], height[j])和當前記錄的最大面積,決定是否更新最大面積。
  • 如果height[i] > height[j],則將j–,因為固定j改變i是沒有意義的,面積不會變大
  • 如果height[i] < height[j],則將i++,同上
  • 回到第一步
  • 這樣只需要遍歷一遍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-----平面木桶最大容量,以较小的纵坐标为高,横坐标差为底的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。