力扣【接雨水问题】 leetcode-42:暴力-备忘录-双指针三种方法
生活随笔
收集整理的這篇文章主要介紹了
力扣【接雨水问题】 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) {//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:暴力-备忘录-双指针三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 岛屿类-网格类问题-DFS | 力扣69
- 下一篇: 力扣【下一个更大元素】leetcode-