LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))
LeetCode 42. Trapping Rain Water
Python解法
解题思路:
本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程。
- 将每一个点的高度和索引存成一个元组 (val, idx)
- 找到最高的点(可能有多个,任取一个),记为 (now_val, now_idx)。
- 向左找第一个val不大于now_val的点(left_val, left_idx)。
- 以left_val作为水平面,用height[left_val+1, now_val-1]中每一个点更新ans。
- now_val, now_idx = left_val, left_idx。
- 如果now_idx >= 0 ,重复执行3;否则执行7。
- 同理从最高点向右遍历更新ans。
向左找的具体操作
- 将每一个点的高度和索引存成一个元组 (val, idx)
- 将元组按val从大到小排序,若val相等,按idx从大到小排序。实现过程:直接sort,然后reverse。
- 从左向右遍历,找到第一个idx小于now_idx的节点(left_val, left_idx),用height[left+1, now-1]中的点更新ans。
- 更新now节点为left节点。
- 如果now_idx >= 0 ,重复执行3;否则结束循环,开始向右找。
向右找的具体操作
- 将每一个点的高度和索引存成一个元组 (val, idx)
- 将元组按val从大到小排序,若val相等,按idx从小到大排序。实现过程:用functools中的cmp_to_key重载排序过程。
- 从左向右遍历,找到第一个idx大于now_idx的节点(right_val, right_idx),用height[now+1, right-1]中的点更新ans。
- 更新now节点为lright节点。
- 如果now_idx >= 0 ,重复执行3;否则执行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))相关推荐
- leetcode#42 Trapping rain water的五种解法详解
leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain Water Given ...
- 【重点:DP 双指针 栈】LeetCode 42. Trapping Rain Water
LeetCode 42. Trapping Rain Water 本博客转载自:http://www.cnblogs.com/grandyang/p/4402392.html [自己又不会做,抄的-& ...
- LeetCode 42 Trapping Rain Water 收集雨水
LeetCode 42 Trapping Rain Water 收集雨水 Given n non-negative integers representing an elevation map whe ...
- LeetCode 42. Trapping Rain Water(收集雨水Ⅰ)
题目描述: Given n non-negative integers representing an elevation map where the width of each bar is 1, ...
- [LeetCode]42. Trapping Rain Water雨水填坑
这个题难点在于无法保证右边是不是有更高的墙可以保证挡住水 双指针可以解决 /*两边指针保证,保证另外一边肯定有能挡住水的地方.如果从一边开始,不考虑另一边,是无法保证右边肯定有挡水的墙,如果右边只都比 ...
- LeetCode 42. Trapping Rain Water--算法题--c++解法
LeetCode 42. Trapping Rain Water–c++解法 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有题目总结 大部分题目 ...
- Leetcode 407. Trapping Rain Water II 收集雨水2 解题报告
1 解题思想 我看了下题目,发现比预想中的简单,加之我比较烂,所以其实我还是没做,只是看懂了上回贴的代码,然后做了一下注释,现在我来讲下题目. 首先请看下上一题,上一题是2D的这题是3D的: Leet ...
- 【重点:BFS】LeetCode 407. Trapping Rain Water II
LeetCode 407. Trapping Rain Water II 博客转载自:http://www.cnblogs.com/grandyang/p/5928987.html [太难了,被智商碾 ...
- Leetcode 动态规划 Trapping Rain Water
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie Trapping Rain Water Total Accepted: 14568 Tota ...
最新文章
- python wget_python-如何获取wget下载的文件的文件名
- 报告:AI技术正有效缩小亚洲医疗发展的差距
- linux下logrotate配置和理解---转
- 方法总结及易错点总结
- Largest Number(leetcode 179)
- HDU5763 another meaning -(KMP+DP)
- 容器化之路:谁偷走了我的构建时间
- 【开发心得】json解析报错Uncaught SyntaxError: Unexpected identifier的解决方法
- php redis入门指南,redis入门指南(四)—— redis如何节省空间
- 笔记本装那一版本Linux好,在我的新笔记本电脑上安装五种Linux版本
- 星际争霸2服务器未能创建游戏,星际争霸2游戏进不去解决方法
- page loading strategy
- 聊聊传统行业产品经理与互联网产品经理的区别
- 数字集成电路 -- 各种计数器简介
- LCD(GEC6818)
- CheckBox复选框全选以及获取值(转)
- Windows中软件的安装
- c语言游戏代码(c语言制作小游戏)
- Solr与mysql数据同步
- pycharm 使用matplotlib 绘图时图片不能显示中文
热门文章
- 剑指offerpython_《剑指offer》3. 从尾到头打印单链表值【Java+Python】
- Java黑皮书课后题第6章:6.37(格式化整数)编写一个测试程序,提示用户输入一个数字以及宽度,显示通过调用format方法返回的字符串
- java list加入listview_Android ListView自动生成列表条目的实例
- git命令详解( 八)
- iTerm2 使用笔记
- SQLServer2008快速清理日志文件
- 【原】TreeView+Checkbox级联操作(IE/FireFox测试通过)
- SqlConnetction类
- 【数据结构与算法】之深入解析“下一个更大元素I”的求解思路与算法示例
- 【数据结构与算法】之深入解析“正则表达式匹配”的求解思路与算法示例