題目:接雨水。給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。
方法一:暴力法
從左到右遍歷陣列,找到當前元素左側最大值以及右側最大值,取最小減去自身即為當前元素積累的面積(如果自身就是那個最小的最大值則減完為0)
class
solution
for(
int j = i; j < size; j++
) ans += math.
min(max_left, max_right)
- height[i];}
return ans;
}}
時間複雜度: o(n2)。陣列中的每個元素都需要向左向右掃瞄。
空間複雜度: o(1)
方法二:雙指標
解法一:
水坑的深度總是由短邊決定
只要right高度》left高度,積水高度將由left_max決定,當前高度比left_max小,則面積+=left_max-當前高度,否則當前高度賦值為left_max。
積水高度將由left_max決定的原因:
只要right高度》left高度,兩種情況:
(1)上一步操作是–right;那麼left指向值的一定是left_max
(2)上一步操作是++left;那麼right指向值的一定是right_max且比left_max大
不管哪種情況,此時right高度一定大於等於left_max
class
solution
else
}return ans;
}}
解法二:
l_max 和 r_max 代表的是 height[0…left] 和 height[right…end] 的最高柱子高度。
如果l_max < r_max,不管這個 r_max是不是右邊最大的都不重要,重要的是height[left]能夠裝的水只和l_max有關。
class
solution
else
}return ans;
}}
想法最重要,想問題的時候不要被題目中的例子侷限住了。 leetcode刷題之路42 接雨水
給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,2,1,0,1...
Leetcode刷題筆記
1.兩數之和給定乙個整數陣列nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。ps 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路 用target減去nums中的每乙個數,並設立乙個字典來記錄對應的下標 class...
LeetCode刷題筆記
實現strstr 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 1 輸入 haystack hello needle ll 輸出 2 示例 2 輸入 haystack aaaa...