Skip to content

Commit 0e6a516

Browse files
committed
feat: add solutions to lc problem: No.1642
No.1642.Furthest Building You Can Reach
1 parent 3cdcdf9 commit 0e6a516

File tree

6 files changed

+273
-2
lines changed

6 files changed

+273
-2
lines changed

solution/1600-1699/1642.Furthest Building You Can Reach/README.md

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,119 @@
6262

6363
<!-- 这里可写通用的实现逻辑 -->
6464

65+
**方法一:贪心 + 优先队列(小根堆)**
66+
67+
梯子最好用在高度差较大的地方,因此我们可以将所有的高度差存入优先队列中,每次取出最小的高度差,如果梯子不够用,则用砖块填补,如果砖块不够用,则返回当前位置。
68+
69+
时间复杂度 $O(n\log n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 `heights` 的长度。
70+
6571
<!-- tabs:start -->
6672

6773
### **Python3**
6874

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

7177
```python
72-
78+
class Solution:
79+
def furthestBuilding(self, heights: List[int], bricks: int, ladders: int) -> int:
80+
h = []
81+
for i, a in enumerate(heights[:-1]):
82+
b = heights[i + 1]
83+
d = b - a
84+
if d > 0:
85+
heappush(h, d)
86+
if len(h) > ladders:
87+
bricks -= heappop(h)
88+
if bricks < 0:
89+
return i
90+
return len(heights) - 1
7391
```
7492

7593
### **Java**
7694

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

7997
```java
98+
class Solution {
99+
public int furthestBuilding(int[] heights, int bricks, int ladders) {
100+
PriorityQueue<Integer> q = new PriorityQueue<>();
101+
int n = heights.length;
102+
for (int i = 0; i < n - 1; ++i) {
103+
int a = heights[i], b = heights[i + 1];
104+
int d = b - a;
105+
if (d > 0) {
106+
q.offer(d);
107+
if (q.size() > ladders) {
108+
bricks -= q.poll();
109+
if (bricks < 0) {
110+
return i;
111+
}
112+
}
113+
}
114+
}
115+
return n - 1;
116+
}
117+
}
118+
```
119+
120+
### **C++**
121+
122+
```cpp
123+
class Solution {
124+
public:
125+
int furthestBuilding(vector<int>& heights, int bricks, int ladders) {
126+
priority_queue<int, vector<int>, greater<int>> q;
127+
int n = heights.size();
128+
for (int i = 0; i < n - 1; ++i) {
129+
int a = heights[i], b = heights[i + 1];
130+
int d = b - a;
131+
if (d > 0) {
132+
q.push(d);
133+
if (q.size() > ladders) {
134+
bricks -= q.top();
135+
q.pop();
136+
if (bricks < 0) {
137+
return i;
138+
}
139+
}
140+
}
141+
}
142+
return n - 1;
143+
}
144+
};
145+
```
80146
147+
### **Go**
148+
149+
```go
150+
func furthestBuilding(heights []int, bricks int, ladders int) int {
151+
q := hp{}
152+
n := len(heights)
153+
for i, a := range heights[:n-1] {
154+
b := heights[i+1]
155+
d := b - a
156+
if d > 0 {
157+
heap.Push(&q, d)
158+
if q.Len() > ladders {
159+
bricks -= heap.Pop(&q).(int)
160+
if bricks < 0 {
161+
return i
162+
}
163+
}
164+
}
165+
}
166+
return n - 1
167+
}
168+
169+
type hp struct{ sort.IntSlice }
170+
171+
func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) }
172+
func (h *hp) Pop() interface{} {
173+
a := h.IntSlice
174+
v := a[len(a)-1]
175+
h.IntSlice = a[:len(a)-1]
176+
return v
177+
}
81178
```
82179

83180
### **...**

solution/1600-1699/1642.Furthest Building You Can Reach/README_EN.md

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,104 @@ It is impossible to go beyond building 4 because you do not have any more bricks
6262
### **Python3**
6363

6464
```python
65-
65+
class Solution:
66+
def furthestBuilding(self, heights: List[int], bricks: int, ladders: int) -> int:
67+
h = []
68+
for i, a in enumerate(heights[:-1]):
69+
b = heights[i + 1]
70+
d = b - a
71+
if d > 0:
72+
heappush(h, d)
73+
if len(h) > ladders:
74+
bricks -= heappop(h)
75+
if bricks < 0:
76+
return i
77+
return len(heights) - 1
6678
```
6779

6880
### **Java**
6981

7082
```java
83+
class Solution {
84+
public int furthestBuilding(int[] heights, int bricks, int ladders) {
85+
PriorityQueue<Integer> q = new PriorityQueue<>();
86+
int n = heights.length;
87+
for (int i = 0; i < n - 1; ++i) {
88+
int a = heights[i], b = heights[i + 1];
89+
int d = b - a;
90+
if (d > 0) {
91+
q.offer(d);
92+
if (q.size() > ladders) {
93+
bricks -= q.poll();
94+
if (bricks < 0) {
95+
return i;
96+
}
97+
}
98+
}
99+
}
100+
return n - 1;
101+
}
102+
}
103+
```
104+
105+
### **C++**
106+
107+
```cpp
108+
class Solution {
109+
public:
110+
int furthestBuilding(vector<int>& heights, int bricks, int ladders) {
111+
priority_queue<int, vector<int>, greater<int>> q;
112+
int n = heights.size();
113+
for (int i = 0; i < n - 1; ++i) {
114+
int a = heights[i], b = heights[i + 1];
115+
int d = b - a;
116+
if (d > 0) {
117+
q.push(d);
118+
if (q.size() > ladders) {
119+
bricks -= q.top();
120+
q.pop();
121+
if (bricks < 0) {
122+
return i;
123+
}
124+
}
125+
}
126+
}
127+
return n - 1;
128+
}
129+
};
130+
```
71131
132+
### **Go**
133+
134+
```go
135+
func furthestBuilding(heights []int, bricks int, ladders int) int {
136+
q := hp{}
137+
n := len(heights)
138+
for i, a := range heights[:n-1] {
139+
b := heights[i+1]
140+
d := b - a
141+
if d > 0 {
142+
heap.Push(&q, d)
143+
if q.Len() > ladders {
144+
bricks -= heap.Pop(&q).(int)
145+
if bricks < 0 {
146+
return i
147+
}
148+
}
149+
}
150+
}
151+
return n - 1
152+
}
153+
154+
type hp struct{ sort.IntSlice }
155+
156+
func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) }
157+
func (h *hp) Pop() interface{} {
158+
a := h.IntSlice
159+
v := a[len(a)-1]
160+
h.IntSlice = a[:len(a)-1]
161+
return v
162+
}
72163
```
73164

74165
### **...**
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
int furthestBuilding(vector<int>& heights, int bricks, int ladders) {
4+
priority_queue<int, vector<int>, greater<int>> q;
5+
int n = heights.size();
6+
for (int i = 0; i < n - 1; ++i) {
7+
int a = heights[i], b = heights[i + 1];
8+
int d = b - a;
9+
if (d > 0) {
10+
q.push(d);
11+
if (q.size() > ladders) {
12+
bricks -= q.top();
13+
q.pop();
14+
if (bricks < 0) {
15+
return i;
16+
}
17+
}
18+
}
19+
}
20+
return n - 1;
21+
}
22+
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
func furthestBuilding(heights []int, bricks int, ladders int) int {
2+
q := hp{}
3+
n := len(heights)
4+
for i, a := range heights[:n-1] {
5+
b := heights[i+1]
6+
d := b - a
7+
if d > 0 {
8+
heap.Push(&q, d)
9+
if q.Len() > ladders {
10+
bricks -= heap.Pop(&q).(int)
11+
if bricks < 0 {
12+
return i
13+
}
14+
}
15+
}
16+
}
17+
return n - 1
18+
}
19+
20+
type hp struct{ sort.IntSlice }
21+
22+
func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) }
23+
func (h *hp) Pop() interface{} {
24+
a := h.IntSlice
25+
v := a[len(a)-1]
26+
h.IntSlice = a[:len(a)-1]
27+
return v
28+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int furthestBuilding(int[] heights, int bricks, int ladders) {
3+
PriorityQueue<Integer> q = new PriorityQueue<>();
4+
int n = heights.length;
5+
for (int i = 0; i < n - 1; ++i) {
6+
int a = heights[i], b = heights[i + 1];
7+
int d = b - a;
8+
if (d > 0) {
9+
q.offer(d);
10+
if (q.size() > ladders) {
11+
bricks -= q.poll();
12+
if (bricks < 0) {
13+
return i;
14+
}
15+
}
16+
}
17+
}
18+
return n - 1;
19+
}
20+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def furthestBuilding(self, heights: List[int], bricks: int, ladders: int) -> int:
3+
h = []
4+
for i, a in enumerate(heights[:-1]):
5+
b = heights[i + 1]
6+
d = b - a
7+
if d > 0:
8+
heappush(h, d)
9+
if len(h) > ladders:
10+
bricks -= heappop(h)
11+
if bricks < 0:
12+
return i
13+
return len(heights) - 1

0 commit comments

Comments
 (0)