摘要:復雜度思路因為蓄水多少取決于比較短的那塊板的長度。代碼復雜度思路考慮說明時候需要計算蓄水量當的時候,需要計算能儲存的水的多少。每次還需要取出一個作為中間值。如果則一直向里面壓進去值,不需要直接計算。
Leetcode[42] Trapping Rain Water
Two PointerGiven n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
復雜度
O(N), O(1);
思路
因為蓄水多少取決于比較短的那塊板的長度。所以每次當左指針指向的板比較短的時候,就將其設置為一個bound,每次向右移動,觀察是否有比左邊這個bound小的板子的存在,如果有,說明到這個位置可以蓄水。
代碼
public int trap(int[] height) { int res = 0; int left = 0, right = height.length - 1; while(left < right) { if(height[left] < height[right]) { int bound = height[left]; int i = left + 1; while(i < right && height[i] < bound) { res += bound - height[i]; i ++; } left = i; } else { int bound = height[right]; int i = right - 1; while(i > left && height[i] < bound) { res += bound - height[i]; i --; } right - i; } } return res; }Stack
復雜度
O(N), O(N)
思路
考慮說明時候需要計算蓄水量:
當val > stack.peek()的時候,需要計算能儲存的水的多少。每次還需要取出一個mid作為中間值。
如果val < stack.peek(),則一直向stack里面壓進去值,不需要直接計算。
代碼
public int trap(int[] height) { int res = 0; Stackstack = new Stack<>(); for(int i = 0; i < height.length; i ++) { if(!stack.isEmpty() && height[i] > height[stack.peek()]) { while(!stack.isEmpty() && height[i] > height[stack.peek()]) { int mid = stack.pop(); if(!stack.isEmpty()) { res += (Math.min(height[stack.peek()], height[i]) - height[mid]) * (i - stack.peek() - 1); } } } stack.push(i); } return res; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65261.html
摘要:我先通過堆棧的方法,找到一個封閉區間,該區間可以盛水,該區間的右節點可以作為下一個封閉區間的起點。思路三堆棧的聰明使用在這里,堆棧允許我們漸進的通過橫向分割而非之前傳統的縱向分割的方式來累加計算盛水量。 題目要求 Given n non-negative integers representing an elevation map where the width of each bar...
摘要:一題目接雨水給定個非負整數表示每個寬度為的柱子的高度圖,計算按此排列的柱子,下雨之后能接多少雨水。上面是由數組表示的高度圖,在這種情況下,可以接個單位的雨水藍色部分表示雨水。提交,答案錯誤。出錯的測試用例為。 做有意思的題是要付出代價的,代價就是死活做不出來。 一、題目 接雨水: 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之后能接多少雨水。show...
摘要:從右向左遍歷時,記錄下上次右邊的峰值,如果左邊一直沒有比這個峰值高的,就加上這些差值。難點在于,當兩個指針遍歷到相鄰的峰時,我們要選取較小的那個峰值來計算差值。所以,我們在遍歷左指針或者右指針之前,要先判斷左右兩個峰值的大小。 Trapping Rain Water Given n non-negative integers representing an elevation map ...
407. Trapping Rain Water II 題目鏈接:https://leetcode.com/problems... 參考discussion里的解法:https://discuss.leetcode.com/... 參考博客里的解釋:http://www.cnblogs.com/grandy... public class Solution { public int tra...
摘要:一種是利用去找同一層的兩個邊,不斷累加寄存。雙指針法的思想先找到左右兩邊的第一個峰值作為參照位,然后分別向后向前每一步增加該位與參照位在這一位的差值,加入,直到下一個峰值,再更新為新的參照位。 Problem Given n non-negative integers representing an elevation map where the width of each bar i...
閱讀 1629·2023-04-25 18:27
閱讀 1389·2021-10-19 11:44
閱讀 563·2021-10-14 09:42
閱讀 2138·2021-10-11 10:59
閱讀 2769·2021-09-24 09:47
閱讀 1723·2019-08-30 14:20
閱讀 1150·2019-08-30 14:08
閱讀 731·2019-08-29 15:15