[LeetCode] Pour Water 倒水
We are given an elevation map, heights[i]
representing the height of the terrain at that index. The width at each index is 1. After V
units of water fall at index K
, how much water is at each index?
Water first drops at index K
and rests on top of the highest terrain or water at that index. Then, it flows according to the following rules:
- If the droplet would eventually fall by moving left, then move left.
- Otherwise, if the droplet would eventually fall by moving right, then move right.
- Otherwise, rise at it's current position.
Here, "eventually fall" means that the droplet will eventually be at a lower level if it moves in that direction. Also, "level" means the height of the terrain plus any water in that column.
We can assume there's infinitely high terrain on the two sides out of bounds of the array. Also, there could not be partial water being spread out evenly on more than 1 grid block - each unit of water has to be in exactly one block.
Example 1:
Input: heights = [2,1,1,2,1,2,2], V = 4, K = 3
Output: [2,2,2,3,2,2,2]
Explanation:
# #
# #
## # ###
#########
0123456 <- index The first drop of water lands at index K = 3: # #
# w #
## # ###
#########
0123456 When moving left or right, the water can only move to the same level or a lower level.
(By level, we mean the total height of the terrain plus any water in that column.)
Since moving left will eventually make it fall, it moves left.
(A droplet "made to fall" means go to a lower height than it was at previously.) # #
# #
## w# ###
#########
0123456 Since moving left will not make it fall, it stays in place. The next droplet falls: # #
# w #
## w# ###
#########
0123456 Since the new droplet moving left will eventually make it fall, it moves left.
Notice that the droplet still preferred to move left,
even though it could move right (and moving right makes it fall quicker.) # #
# w #
## w# ###
#########
0123456 # #
# #
##ww# ###
#########
0123456 After those steps, the third droplet falls.
Since moving left would not eventually make it fall, it tries to move right.
Since moving right would eventually make it fall, it moves right. # #
# w #
##ww# ###
#########
0123456 # #
# #
##ww#w###
#########
0123456 Finally, the fourth droplet falls.
Since moving left would not eventually make it fall, it tries to move right.
Since moving right would not eventually make it fall, it stays in place: # #
# w #
##ww#w###
#########
0123456 The final answer is [2,2,2,3,2,2,2]: #
#######
#######
0123456
Example 2:
Input: heights = [1,2,3,4], V = 2, K = 2
Output: [2,3,3,4]
Explanation:
The last droplet settles at index 1, since moving further left would not cause it to eventually fall to a lower height.
Example 3:
Input: heights = [3,1,3], V = 5, K = 1
Output: [4,4,4]
Note:
heights
will have length in[1, 100]
and contain integers in[0, 99]
.V
will be in range[0, 2000]
.K
will be in range[0, heights.length - 1]
.
这道题说有不同高度的地面,每次都位置K有水滴落下,水滴落下后移动的方向有如下的规则:
1. 如果水滴向左移动后最终停止的位置低于落下的位置,则向左移动。
2. 否则若水滴向右移动后最终停止的位置低于落下的位置,则向右移动。
3. 否则停在原来的位置。
水滴停止后,原来的位置高度就增加1,让我们返回最后地面的高度。我们首先来分析题目中的例子1:
# #
# #
######
#########
我们可以观察出,如果左边到的位置低的话,就先去左边,即便右边能到同样低的位置,也还是左边优先。但是这个例子没能说明,如果右边的位置更低的话,是去右边呢,还是左边,看下面这个例子:
# #
### ###
##### #####
#############
红色表示水滴落下的位置,我们可以看到第五滴水没有去右边更低的地方,而是去了左边的位置,这说明,左边有至高优先权,只要左边的最终位置低于水滴落下的位置,一定会去左边。
还有就是,去一个方向最终要落到一个局部最低点,请看下面这个例子:
#
#### #
##### #
#######
我们可以看到,水滴去了右边第一个局部最低点,而再右边的全局最低点是无法到达的。如果都是一样的高度的话,落在离水滴落下起始位置最近的点,请看下下面这两个例子:
#
####
#####
#
#####
#####
第一个例子中水滴去了局部最低点,第二个例子中由于右边的高度都相同,水滴去了最靠近起始位置的点。
那么分析到这里,我想思路应该比较明晰了吧。首先我们尝试向左走,找到第一个局部最低点,停止条件是左边的高度大于当前高度,但是为了防止出现大家高度都一样而需要停止在靠近起始点位置的情况,我们来一个回滚操作,就是只要和右边的高度一样,就一直往右滚。同样,在尝试向右走,找第一个局部最低点,停止条件是右边的高度大于当前高度,但是为了防止出现大家高度都一样而需要停止在靠近起始点位置的情况,我们也来一个回滚操作,就是只要和左边的高度一样,就一直往左滚。那么此时我们来做比较,如果左边的局部最低点小于雨滴落下位置的高度,那么左边局部最低点高度自增1。否则如果右边的局部最低点高度小于雨滴落下位置的高度,则右边局部最低点高度自增1。如果左右高度都一样,则雨滴落下位置的高度自增1,参见代码如下:
class Solution {
public:
vector<int> pourWater(vector<int>& heights, int V, int K) {
for (int i = ; i < V; ++i) {
int l = K, r = K, n = heights.size();
while (l > && heights[l] >= heights[l - ]) --l;
while (l < K && heights[l] == heights[l + ]) ++l;
while (r < n - && heights[r] >= heights[r + ]) ++r;
while (r > K && heights[r] == heights[r - ]) --r;
(heights[l] < heights[K]) ? ++heights[l] : ++heights[r];
}
return heights;
}
};
类似题目:
参考资料:
https://leetcode.com/problems/pour-water/discuss/116670/My-8-Lines-C++-Solution
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Pour Water 倒水的更多相关文章
- LintCode——Pour Water
Pour Water: We are given an elevation map, heights[i] representing the height of the terrain at that ...
- ZOJ 3913 Bob wants to pour water ZOJ Monthly, October 2015 - H
Bob wants to pour water Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge There i ...
- LeetCode 755. Pour Water
原题链接在这里:https://leetcode.com/problems/pour-water/description/ 题目: We are given an elevation map, hei ...
- Leetcode 365. Water and Jug Problem
可以想象有一个无限大的水罐,如果我们有两个杯子x和y,那么原来的问题等价于是否可以通过往里面注入或倒出水从而剩下z. z =? m*x + n*y 如果等式成立,那么z%gcd(x,y) == 0. ...
- ZOJ 3913 Bob wants to pour water
ZOJ Monthly, October 2015 K题 二分答案+验证 #include<iostream> #include<algorithm> #include< ...
- [LeetCode] Water and Jug Problem 水罐问题
You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...
- 【LeetCode】365. Water and Jug Problem 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学题 相似题目 参考资料 日期 题目地址:http ...
- [LeetCode] Trapping Rain Water 收集雨水
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- Leetcode: Water and Jug Problem && Summary: GCD求法(辗转相除法 or Euclidean algorithm)
You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...
随机推荐
- 跟着大神学zookeeper分布式锁实现-----来自Ruthless
前几天分享了@Ruthless大神的Redis锁,发现和大家都学习了很多东西.因为分布式锁里面,最好的实现是zookeeper的分布式锁.所以在这里把实现方式和大家分享一下. zookeeper分布式 ...
- 设计模式之迭代器模式详解(foreach的精髓)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...
- Web安全概述
互联网刚开始是安全的,但是伴随着黑客(Hacker)的诞生,互联网变得越来越不安全.任何一个事情都有两面性,黑客也有好有坏,好的黑客叫白帽子,坏的黑客叫黑帽子.与此同时,随着Web技术发展越来越成熟, ...
- python爬虫解决gbk乱码问题
今天尝试了下爬虫,爬取一本小说,忘语的凡人修仙仙界篇,当然这样不好,大家要支持正版. 爬取过程中是老套路,先获取网页源代码 # -*- coding:UTF-8 -*- from bs4 import ...
- HTTP协议----请求方法和状态码
现在广泛使用的是HTTP/1.1版本,发布于1997年. 理解HTTP协议,首先从请求开始,比如: POST /form/entry HTTP/1.1 格式为: 请求方法 URI 协议版本 请求方法: ...
- php项目中常用的log日志记录方法
function log_result($str) { if (LOG_WRITEOUT == 1) { $fp = fopen ( "log.txt", "a+&quo ...
- 2018上C语言程序设计(高级)博客作业样例
要求一(20分) 完成PTA中题目集名为<usth-C语言高级-第1次作业>中的所有题目. 要求二 PTA作业的总结(20分+30分) 将PTA第1次作业作业中以下2道题的解题思路按照规定 ...
- 201621123062《java程序设计》第11周作业总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 思维导图: 2. 书面作业 本次PTA作业题集多线程 2.1. 源代码阅读:多线程程序BounceThread 2 ...
- 项目Alpha冲刺Day1
一.会议照片 二.项目进展 1.今日安排 讨论完成项目的详细设计,并完成数据库的设计,学习powerDesigner的使用 2.问题困难 powerDesigner导出sql语句因为问题无法导入,特别 ...
- Django 视图层
URL映射 1.分布式url映射 include()函数提供分布式url映射功能,使URL映射可以被编写在多个url.py文件中 from django.conf.urls import url fr ...