Skip to content

Commit 1a3880f

Browse files
committed
feat: add solutions to lc problem: No.0755
No.0755.Pour Water
1 parent d7ba32e commit 1a3880f

File tree

6 files changed

+229
-2
lines changed

6 files changed

+229
-2
lines changed

solution/0700-0799/0755.Pour Water/README.md

+74-1
Original file line numberDiff line numberDiff line change
@@ -143,22 +143,95 @@
143143

144144
<!-- 这里可写通用的实现逻辑 -->
145145

146+
**方法一:模拟**
147+
148+
我们可以模拟每一单位的水滴下落的过程,每次下落时,我们首先尝试向左移动,如果可以移动到更低的高度,则移动到最低的高度处;如果不能移动到更低的高度,则尝试向右移动,如果可以移动到更低的高度,则移动到最低的高度处;如果不能移动到更低的高度,则在当前位置上升。
149+
150+
时间复杂度 $O(v \times n),空间复杂度 O(1)$。其中 $v$ 和 $n$ 分别是水滴的数量和高度数组的长度。
151+
146152
<!-- tabs:start -->
147153

148154
### **Python3**
149155

150156
<!-- 这里可写当前语言的特殊实现逻辑 -->
151157

152158
```python
153-
159+
class Solution:
160+
def pourWater(self, heights: List[int], volume: int, k: int) -> List[int]:
161+
for _ in range(volume):
162+
for d in (-1, 1):
163+
i = j = k
164+
while 0 <= i + d < len(heights) and heights[i + d] <= heights[i]:
165+
if heights[i + d] < heights[i]:
166+
j = i + d
167+
i += d
168+
if j != k:
169+
heights[j] += 1
170+
break
171+
else:
172+
heights[k] += 1
173+
return heights
154174
```
155175

156176
### **Java**
157177

158178
<!-- 这里可写当前语言的特殊实现逻辑 -->
159179

160180
```java
181+
class Solution {
182+
public int[] pourWater(int[] heights, int volume, int k) {
183+
while (volume-- > 0) {
184+
boolean find = false;
185+
for (int d = -1; d < 2 && !find; d += 2) {
186+
int i = k, j = k;
187+
while (i + d >= 0 && i + d < heights.length && heights[i + d] <= heights[i]) {
188+
if (heights[i + d] < heights[i]) {
189+
j = i + d;
190+
}
191+
i += d;
192+
}
193+
if (j != k) {
194+
find = true;
195+
++heights[j];
196+
}
197+
}
198+
if (!find) {
199+
++heights[k];
200+
}
201+
}
202+
return heights;
203+
}
204+
}
205+
```
161206

207+
### **C++**
208+
209+
```cpp
210+
class Solution {
211+
public:
212+
vector<int> pourWater(vector<int>& heights, int volume, int k) {
213+
while (volume--) {
214+
bool find = false;
215+
for (int d = -1; d < 2 && !find; d += 2) {
216+
int i = k, j = k;
217+
while (i + d >= 0 && i + d < heights.size() && heights[i + d] <= heights[i]) {
218+
if (heights[i + d] < heights[i]) {
219+
j = i + d;
220+
}
221+
i += d;
222+
}
223+
if (j != k) {
224+
find = true;
225+
++heights[j];
226+
}
227+
}
228+
if (!find) {
229+
++heights[k];
230+
}
231+
}
232+
return heights;
233+
}
234+
};
162235
```
163236
164237
### **...**

solution/0700-0799/0755.Pour Water/README_EN.md

+68-1
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,80 @@ Finally, the fourth droplet falls at index k = 3. Since moving left would not ev
6868
### **Python3**
6969

7070
```python
71-
71+
class Solution:
72+
def pourWater(self, heights: List[int], volume: int, k: int) -> List[int]:
73+
for _ in range(volume):
74+
for d in (-1, 1):
75+
i = j = k
76+
while 0 <= i + d < len(heights) and heights[i + d] <= heights[i]:
77+
if heights[i + d] < heights[i]:
78+
j = i + d
79+
i += d
80+
if j != k:
81+
heights[j] += 1
82+
break
83+
else:
84+
heights[k] += 1
85+
return heights
7286
```
7387

7488
### **Java**
7589

7690
```java
91+
class Solution {
92+
public int[] pourWater(int[] heights, int volume, int k) {
93+
while (volume-- > 0) {
94+
boolean find = false;
95+
for (int d = -1; d < 2 && !find; d += 2) {
96+
int i = k, j = k;
97+
while (i + d >= 0 && i + d < heights.length && heights[i + d] <= heights[i]) {
98+
if (heights[i + d] < heights[i]) {
99+
j = i + d;
100+
}
101+
i += d;
102+
}
103+
if (j != k) {
104+
find = true;
105+
++heights[j];
106+
}
107+
}
108+
if (!find) {
109+
++heights[k];
110+
}
111+
}
112+
return heights;
113+
}
114+
}
115+
```
77116

117+
### **C++**
118+
119+
```cpp
120+
class Solution {
121+
public:
122+
vector<int> pourWater(vector<int>& heights, int volume, int k) {
123+
while (volume--) {
124+
bool find = false;
125+
for (int d = -1; d < 2 && !find; d += 2) {
126+
int i = k, j = k;
127+
while (i + d >= 0 && i + d < heights.size() && heights[i + d] <= heights[i]) {
128+
if (heights[i + d] < heights[i]) {
129+
j = i + d;
130+
}
131+
i += d;
132+
}
133+
if (j != k) {
134+
find = true;
135+
++heights[j];
136+
}
137+
}
138+
if (!find) {
139+
++heights[k];
140+
}
141+
}
142+
return heights;
143+
}
144+
};
78145
```
79146
80147
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
vector<int> pourWater(vector<int>& heights, int volume, int k) {
4+
while (volume--) {
5+
bool find = false;
6+
for (int d = -1; d < 2 && !find; d += 2) {
7+
int i = k, j = k;
8+
while (i + d >= 0 && i + d < heights.size() && heights[i + d] <= heights[i]) {
9+
if (heights[i + d] < heights[i]) {
10+
j = i + d;
11+
}
12+
i += d;
13+
}
14+
if (j != k) {
15+
find = true;
16+
++heights[j];
17+
}
18+
}
19+
if (!find) {
20+
++heights[k];
21+
}
22+
}
23+
return heights;
24+
}
25+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func pourWater(heights []int, volume int, k int) []int {
2+
for ; volume > 0; volume-- {
3+
find := false
4+
for _, d := range [2]int{-1, 1} {
5+
i, j := k, k
6+
for i+d >= 0 && i+d < len(heights) && heights[i+d] <= heights[i] {
7+
if heights[i+d] < heights[i] {
8+
j = i + d
9+
}
10+
i += d
11+
}
12+
if j != k {
13+
find = true
14+
heights[j]++
15+
break
16+
}
17+
}
18+
if !find {
19+
heights[k]++
20+
}
21+
}
22+
return heights
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
public int[] pourWater(int[] heights, int volume, int k) {
3+
while (volume-- > 0) {
4+
boolean find = false;
5+
for (int d = -1; d < 2 && !find; d += 2) {
6+
int i = k, j = k;
7+
while (i + d >= 0 && i + d < heights.length && heights[i + d] <= heights[i]) {
8+
if (heights[i + d] < heights[i]) {
9+
j = i + d;
10+
}
11+
i += d;
12+
}
13+
if (j != k) {
14+
find = true;
15+
++heights[j];
16+
}
17+
}
18+
if (!find) {
19+
++heights[k];
20+
}
21+
}
22+
return heights;
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def pourWater(self, heights: List[int], volume: int, k: int) -> List[int]:
3+
for _ in range(volume):
4+
for d in (-1, 1):
5+
i = j = k
6+
while 0 <= i + d < len(heights) and heights[i + d] <= heights[i]:
7+
if heights[i + d] < heights[i]:
8+
j = i + d
9+
i += d
10+
if j != k:
11+
heights[j] += 1
12+
break
13+
else:
14+
heights[k] += 1
15+
return heights

0 commit comments

Comments
 (0)