LeetCode 42. Trapping Rain Water

Python解法

解题思路:

本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程。

  1. 将每一个点的高度和索引存成一个元组 (val, idx)
  2. 找到最高的点(可能有多个,任取一个),记为 (now_val, now_idx)。
  3. 向左找第一个val不大于now_val的点(left_val, left_idx)。
  4. 以left_val作为水平面,用height[left_val+1, now_val-1]中每一个点更新ans。
  5. now_val, now_idx = left_val, left_idx。
  6. 如果now_idx >= 0 ,重复执行3;否则执行7。
  7. 同理从最高点向右遍历更新ans。

向左找的具体操作

  1. 将每一个点的高度和索引存成一个元组 (val, idx)
  2. 将元组按val从大到小排序,若val相等,按idx从大到小排序。实现过程:直接sort,然后reverse。
  3. 从左向右遍历,找到第一个idx小于now_idx的节点(left_val, left_idx),用height[left+1, now-1]中的点更新ans。
  4. 更新now节点为left节点。
  5. 如果now_idx >= 0 ,重复执行3;否则结束循环,开始向右找。

向右找的具体操作

  1. 将每一个点的高度和索引存成一个元组 (val, idx)
  2. 将元组按val从大到小排序,若val相等,按idx从小到大排序。实现过程:用functools中的cmp_to_key重载排序过程。
  3. 从左向右遍历,找到第一个idx大于now_idx的节点(right_val, right_idx),用height[now+1, right-1]中的点更新ans。
  4. 更新now节点为lright节点。
  5. 如果now_idx >= 0 ,重复执行3;否则执行6。
  6. 输出ans。
注意:向左向右只有排序不同,其他操作类似,

利用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 ans

C++解法

解题思路:

本思路与Python类似,需找到最高点左右遍历,时间复杂度O(nlogn)以下为向左遍历的过程。差别在于C++是存map,无须手动排序。

// m中first存高度val,second存索引集合。
// set<int> s = m[2]表示高度为2的点的位置集合。
map<int, set<int>> m;

实现代码如下:

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的点的位置集合。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;}
};

LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))相关推荐

  1. leetcode#42 Trapping rain water的五种解法详解

    leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain Water Given ...

  2. 【重点:DP 双指针 栈】LeetCode 42. Trapping Rain Water

    LeetCode 42. Trapping Rain Water 本博客转载自:http://www.cnblogs.com/grandyang/p/4402392.html [自己又不会做,抄的-& ...

  3. LeetCode 42 Trapping Rain Water 收集雨水

    LeetCode 42 Trapping Rain Water 收集雨水 Given n non-negative integers representing an elevation map whe ...

  4. LeetCode 42. Trapping Rain Water(收集雨水Ⅰ)

    题目描述: Given n non-negative integers representing an elevation map where the width of each bar is 1, ...

  5. [LeetCode]42. Trapping Rain Water雨水填坑

    这个题难点在于无法保证右边是不是有更高的墙可以保证挡住水 双指针可以解决 /*两边指针保证,保证另外一边肯定有能挡住水的地方.如果从一边开始,不考虑另一边,是无法保证右边肯定有挡水的墙,如果右边只都比 ...

  6. LeetCode 42. Trapping Rain Water--算法题--c++解法

    LeetCode 42. Trapping Rain Water–c++解法 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有题目总结 大部分题目 ...

  7. Leetcode 407. Trapping Rain Water II 收集雨水2 解题报告

    1 解题思想 我看了下题目,发现比预想中的简单,加之我比较烂,所以其实我还是没做,只是看懂了上回贴的代码,然后做了一下注释,现在我来讲下题目. 首先请看下上一题,上一题是2D的这题是3D的: Leet ...

  8. 【重点:BFS】LeetCode 407. Trapping Rain Water II

    LeetCode 407. Trapping Rain Water II 博客转载自:http://www.cnblogs.com/grandyang/p/5928987.html [太难了,被智商碾 ...

  9. Leetcode 动态规划 Trapping Rain Water

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie Trapping Rain Water Total Accepted: 14568 Tota ...

最新文章

  1. python wget_python-如何获取wget下载的文件的文件名
  2. 报告:AI技术正有效缩小亚洲医疗发展的差距
  3. linux下logrotate配置和理解---转
  4. 方法总结及易错点总结
  5. Largest Number(leetcode 179)
  6. HDU5763 another meaning -(KMP+DP)
  7. 容器化之路:谁偷走了我的构建时间
  8. 【开发心得】json解析报错Uncaught SyntaxError: Unexpected identifier的解决方法
  9. php redis入门指南,redis入门指南(四)—— redis如何节省空间
  10. 笔记本装那一版本Linux好,在我的新笔记本电脑上安装五种Linux版本
  11. 星际争霸2服务器未能创建游戏,星际争霸2游戏进不去解决方法
  12. page loading strategy
  13. 聊聊传统行业产品经理与互联网产品经理的区别
  14. 数字集成电路 -- 各种计数器简介
  15. LCD(GEC6818)
  16. CheckBox复选框全选以及获取值(转)
  17. Windows中软件的安装
  18. c语言游戏代码(c语言制作小游戏)
  19. Solr与mysql数据同步
  20. pycharm 使用matplotlib 绘图时图片不能显示中文

热门文章

  1. 剑指offerpython_《剑指offer》3. 从尾到头打印单链表值【Java+Python】
  2. Java黑皮书课后题第6章:6.37(格式化整数)编写一个测试程序,提示用户输入一个数字以及宽度,显示通过调用format方法返回的字符串
  3. java list加入listview_Android ListView自动生成列表条目的实例
  4. git命令详解( 八)
  5. iTerm2 使用笔记
  6. SQLServer2008快速清理日志文件
  7. 【原】TreeView+Checkbox级联操作(IE/FireFox测试通过)
  8. SqlConnetction类
  9. 【数据结构与算法】之深入解析“下一个更大元素I”的求解思路与算法示例
  10. 【数据结构与算法】之深入解析“正则表达式匹配”的求解思路与算法示例