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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

力扣【接雨水问题】 leetcode-42:暴力-备忘录-双指针三种方法

發布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 力扣【接雨水问题】 leetcode-42:暴力-备忘录-双指针三种方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述:


思路:

不要去思考整體裝多少,應該去思考局部的;
去想每一個 i 的位置,最多能夠裝多少雨水;

這里的 i 位置最多可以裝 2 雨水;
核心就是:每一個 i 位置的雨水量,都 和 i 位置 左邊最高的柱子,右邊最高的柱子有關。
需要知道 i 位置左邊所有的柱子最高的,以及 i 位置 右邊所有的柱子最高的,然后 取得一個 Min。 畢竟裝雨水多少,是由最矮的那一個去決定的!
所以,題目的難題就在于,怎么獲取 l_max and r_max,在獲取的方式上面去一步一步優化。

大致框架:
water[i] = min(max(left) , max(right)) - height[i];

解法一:暴力法:

時間復雜度 O(N^2),空間復雜度 O(1)。

class Solution { public:int trap(vector<int>& height) {//1、暴力法 O(n^2) 我們不要想整體,而應該去想局部//具體來說,僅僅對于位置i,能裝下多少水呢?int n= height.size();int res = 0;for (int i =0 ; i < n - 1; i++) {int l_max = 0; int r_max = 0;//找左右兩邊最高的比較 min 減去自己 就是單獨自己的裝最多的for (int j = i; j < n; j++) {r_max = max(r_max,height[j]);}for (int j = i; j >= 0; j--) {l_max = max(l_max,height[j]);}res += min(l_max,r_max) - height[i];}return res;} };

一頓操作猛如虎
一看結果百分五~
執行結果:

解法二,備忘錄算法

其實是上面暴力法的一個優化,暴力法是到了每一個位置,都要計算這個位置的 l_max 和 r_max;備忘錄算法只是預先算好了,放在一個數組里面;
所以備忘錄算法時間復雜度降低為 O(N),但是空間復雜度是 O(N)。

class Solution { public:int trap(vector<int>& height) {//2、備忘錄優化為 O(n);提前算好每一個位置 左右最高和最低的if (height.empty()) return 0;int n = height.size();int res = 0;vector<int> l_max(n), r_max(n);l_max[0] = height[0];r_max[n - 1] = height[n - 1];for (int i = 1; i < n; i++) {l_max[i] = max(height[i],l_max[i - 1]) ;}for (int i = n -2; i >= 0; i--) {r_max[i] = max(height[i],r_max[i + 1]) ;}for (int i = 1; i< n - 1; i++) {res += min(l_max[i],r_max[i]) - height[i];} return res; } };

執行結果:

解法三:雙指針

雙指針邊走邊算,節約空間復雜度

class Solution { public:int trap(vector<int>& height) {//3、雙指針解法if (height.empty()) return 0;int n = height.size();int res = 0;int left = 0;int right = n - 1;int l_max = height[0];int r_max = height[n - 1];while (left <= right) {l_max =max(l_max,height[left]);r_max =max(r_max,height[right]);if (l_max < r_max) {res += l_max - height[left];left ++;} else {res += r_max - height[right];right --;}}return res;} };

執行結果:

總結

以上是生活随笔為你收集整理的力扣【接雨水问题】 leetcode-42:暴力-备忘录-双指针三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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