LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                LeetCode 42. Trapping Rain Water
Python解法
解題思路:
本思路需找到最高點(diǎn)左右遍歷,時間復(fù)雜度O(nlogn),以下為向左遍歷的過程。
向左找的具體操作
向右找的具體操作
注意:向左向右只有排序不同,其他操作類似,
利用functools中的cmp_to_key重載排序過程代碼如下:
def mcmp(a, b):val1,idx1 = aval2,idx2 = bif val1 == val2:return idx2-idx1return val1-val2from functools import cmp_to_key l = [] # l中存元組(val, idx) l.sort(reverse=True, key=cmp_to_key(Solution.mcmp))代碼如下
class Solution:# 利用functools中的cmp_to_key重載排序:def mcmp(a, b):val1,idx1 = aval2,idx2 = bif val1 == val2:return idx2-idx1return val1-val2def trap(self, height: List[int]) -> int:if len(height) == 0:return 0from functools import cmp_to_keyl = []# 將(val, idx)存入l = []中for i in range(0, len(height)):l.append((height[i],i))ans = 0# 往左找l.sort(reverse=True)h, con = l[0]for i in range(1, len(l)):val, left = l[i]if left < con:for j in range(left+1, con):ans += val - height[j]con = left# 往右找h, con = l[0]l.sort(reverse=True, key=cmp_to_key(Solution.mcmp))for i in range(1, len(l)):val, right = l[i]if right > con:for j in range(con+1, right):ans += val - height[j]con = rightreturn ansC++解法
解題思路:
本思路與Python類似,需找到最高點(diǎn)左右遍歷,時間復(fù)雜度O(nlogn)以下為向左遍歷的過程。差別在于C++是存map,無須手動排序。
// m中first存高度val,second存索引集合。 // set<int> s = m[2]表示高度為2的點(diǎn)的位置集合。 map<int, set<int>> m;實現(xiàn)代碼如下:
class Solution { public:int trap(vector<int>& height) {if(height.size() == 0) return 0;int ans = 0;// m中first存高度val,second存索引集合。// set<int> s = m[2]表示高度為2的點(diǎn)的位置集合。map<int, set<int>> m;// itm表示m的一個迭代器map<int, set<int>>::iterator itm;set<int> s;set<int>::iterator its;//將(val, idx)存入mapint sz = height.size();for(int i = 0;i < sz; ++i){m[height[i]].insert(i);}//向左找itm = --m.end();s = itm->second;int h = itm->first;int left = *s.begin();//每次找val小,idx小的while(left != -1 && left >= 0){s = m[h];its = s.lower_bound(left);if(its == s.begin()){if(itm == m.begin()){left = -1;}else{--itm;h = itm->first;}}else{--its;for(int i = *its+1;i < left; ++i){ans += h-height[i];}left = *its;continue;}}//向右找itm = --m.end();s = itm->second;h = itm->first;int right = *s.begin();//每次找val小,idx大的while(right != -1 && right < sz){s = m[h];its = s.upper_bound(right);if(its == s.end()){if(itm == m.begin()){right = -1;}else{--itm;h = itm->first;}}else{for(int i = right+1;i < *its; ++i){ans += h-height[i];}right = *its;continue;}}return ans;} };總結(jié)
以上是生活随笔為你收集整理的LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: LeetCode 287. Find t
 - 下一篇: LeetCode 75. Sort Co