Skip to content

Commit cdb0a06

Browse files
committed
feat: add solutions to lc problem: No.2473
No.2473.Minimum Cost to Buy Apples
1 parent af2646d commit cdb0a06

File tree

10 files changed

+552
-4
lines changed

10 files changed

+552
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
class Solution:
22
def isToeplitzMatrix(self, matrix: List[List[int]]) -> bool:
33
m, n = len(matrix), len(matrix[0])
4-
return all(matrix[i][j] == matrix[i - 1][j - 1] for i in range(1, m) for j in range(1, n))
4+
return all(
5+
matrix[i][j] == matrix[i - 1][j - 1]
6+
for i in range(1, m)
7+
for j in range(1, n)
8+
)

solution/0700-0799/0795.Number of Subarrays with Bounded Maximum/Solution.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ def numSubarrayBoundedMax(self, nums: List[int], left: int, right: int) -> int:
1616
if stk:
1717
r[i] = stk[-1]
1818
stk.append(i)
19-
return sum((i - l[i]) * (r[i] - i) for i, v in enumerate(nums) if left <= v <= right)
19+
return sum(
20+
(i - l[i]) * (r[i] - i) for i, v in enumerate(nums) if left <= v <= right
21+
)

solution/2400-2499/2467.Most Profitable Path in a Tree/Solution.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
class Solution:
2-
def mostProfitablePath(self, edges: List[List[int]], bob: int, amount: List[int]) -> int:
2+
def mostProfitablePath(
3+
self, edges: List[List[int]], bob: int, amount: List[int]
4+
) -> int:
35
def dfs1(i, fa, t):
46
if i == 0:
57
ts[i] = min(ts[i], t)

solution/2400-2499/2468.Split Message Based on Limit/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def splitMessage(self, message: str, limit: int) -> List[str]:
1111
i = 0
1212
for j in range(1, k + 1):
1313
tail = f'<{j}/{k}>'
14-
t = message[i: i + limit - len(tail)] + tail
14+
t = message[i : i + limit - len(tail)] + tail
1515
ans.append(t)
1616
i += limit - len(tail)
1717
return ans

solution/2400-2499/2473.Minimum Cost to Buy Apples/README.md

+186
Original file line numberDiff line numberDiff line change
@@ -54,22 +54,208 @@
5454

5555
<!-- 这里可写通用的实现逻辑 -->
5656

57+
**方法一:堆优化版 Dijkstra 算法**
58+
59+
我们枚举起点,对于每个起点,使用 Dijkstra 算法求出到其他所有点的最短距离,更新最小值即可。
60+
61+
时间复杂度 $O(n \times m \times \log m)$,其中 $n$ 和 $m$ 分别是城市数量和道路数量。
62+
5763
<!-- tabs:start -->
5864

5965
### **Python3**
6066

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

6369
```python
70+
class Solution:
71+
def minCost(self, n: int, roads: List[List[int]], appleCost: List[int], k: int) -> List[int]:
72+
def dijkstra(i):
73+
q = [(0, i)]
74+
dist = [inf] * n
75+
dist[i] = 0
76+
ans = inf
77+
while q:
78+
d, u = heappop(q)
79+
ans = min(ans, appleCost[u] + d * (k + 1))
80+
for v, w in g[u]:
81+
if dist[v] > dist[u] + w:
82+
dist[v] = dist[u] + w
83+
heappush(q, (dist[v], v))
84+
return ans
6485

86+
g = defaultdict(list)
87+
for a, b, c in roads:
88+
a, b = a - 1, b - 1
89+
g[a].append((b, c))
90+
g[b].append((a, c))
91+
return [dijkstra(i) for i in range(n)]
6592
```
6693

6794
### **Java**
6895

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

7198
```java
99+
class Solution {
100+
private int k;
101+
private int[] cost;
102+
private int[] dist;
103+
private List<int[]>[] g;
104+
private static final int INF = 0x3f3f3f3f;
105+
106+
public long[] minCost(int n, int[][] roads, int[] appleCost, int k) {
107+
cost = appleCost;
108+
g = new List[n];
109+
dist = new int[n];
110+
this.k = k;
111+
for (int i = 0; i < n; ++i) {
112+
g[i] = new ArrayList<>();
113+
}
114+
for (var e : roads) {
115+
int a = e[0] - 1, b = e[1] - 1, c = e[2];
116+
g[a].add(new int[] {b, c});
117+
g[b].add(new int[] {a, c});
118+
}
119+
long[] ans = new long[n];
120+
for (int i = 0; i < n; ++i) {
121+
ans[i] = dijkstra(i);
122+
}
123+
return ans;
124+
}
125+
126+
private long dijkstra(int u) {
127+
PriorityQueue<int[]> q = new PriorityQueue<>((a, b) -> a[0] - b[0]);
128+
q.offer(new int[] {0, u});
129+
Arrays.fill(dist, INF);
130+
dist[u] = 0;
131+
long ans = Long.MAX_VALUE;
132+
while (!q.isEmpty()) {
133+
var p = q.poll();
134+
int d = p[0];
135+
u = p[1];
136+
ans = Math.min(ans, cost[u] + (long) (k + 1) * d);
137+
for (var ne : g[u]) {
138+
int v = ne[0], w = ne[1];
139+
if (dist[v] > dist[u] + w) {
140+
dist[v] = dist[u] + w;
141+
q.offer(new int[] {dist[v], v});
142+
}
143+
}
144+
}
145+
return ans;
146+
}
147+
}
148+
```
149+
150+
### **C++**
151+
152+
```cpp
153+
using ll = long long;
154+
using pii = pair<int, int>;
155+
156+
class Solution {
157+
public:
158+
const int inf = 0x3f3f3f3f;
159+
160+
vector<long long> minCost(int n, vector<vector<int>>& roads, vector<int>& appleCost, int k) {
161+
vector<vector<pii>> g(n);
162+
for (auto& e : roads) {
163+
int a = e[0] - 1, b = e[1] - 1, c = e[2];
164+
g[a].push_back({b, c});
165+
g[b].push_back({a, c});
166+
}
167+
int dist[n];
168+
auto dijkstra = [&](int u) {
169+
memset(dist, 63, sizeof dist);
170+
priority_queue<pii, vector<pii>, greater<pii>> q;
171+
q.push({0, u});
172+
dist[u] = 0;
173+
ll ans = LONG_MAX;
174+
while (!q.empty()) {
175+
auto p = q.top();
176+
q.pop();
177+
int d = p.first;
178+
u = p.second;
179+
ans = min(ans, appleCost[u] + 1ll * d * (k + 1));
180+
for (auto& ne : g[u]) {
181+
auto [v, w] = ne;
182+
if (dist[v] > dist[u] + w) {
183+
dist[v] = dist[u] + w;
184+
q.push({dist[v], v});
185+
}
186+
}
187+
}
188+
return ans;
189+
};
190+
vector<ll> ans(n);
191+
for (int i = 0; i < n; ++i) ans[i] = dijkstra(i);
192+
return ans;
193+
}
194+
};
195+
```
196+
197+
### **Go**
198+
199+
```go
200+
func minCost(n int, roads [][]int, appleCost []int, k int) []int64 {
201+
g := make([]pairs, n)
202+
for _, e := range roads {
203+
a, b, c := e[0]-1, e[1]-1, e[2]
204+
g[a] = append(g[a], pair{b, c})
205+
g[b] = append(g[b], pair{a, c})
206+
}
207+
const inf int = 0x3f3f3f3f
208+
dist := make([]int, n)
209+
dijkstra := func(u int) int64 {
210+
var ans int64 = math.MaxInt64
211+
for i := range dist {
212+
dist[i] = inf
213+
}
214+
dist[u] = 0
215+
q := make(pairs, 0)
216+
heap.Push(&q, pair{0, u})
217+
for len(q) > 0 {
218+
p := heap.Pop(&q).(pair)
219+
d := p.first
220+
u = p.second
221+
ans = min(ans, int64(appleCost[u]+d*(k+1)))
222+
for _, ne := range g[u] {
223+
v, w := ne.first, ne.second
224+
if dist[v] > dist[u]+w {
225+
dist[v] = dist[u] + w
226+
heap.Push(&q, pair{dist[v], v})
227+
}
228+
}
229+
}
230+
return ans
231+
}
232+
ans := make([]int64, n)
233+
for i := range ans {
234+
ans[i] = dijkstra(i)
235+
}
236+
return ans
237+
}
238+
239+
func min(a, b int64) int64 {
240+
if a < b {
241+
return a
242+
}
243+
return b
244+
}
245+
246+
type pair struct{ first, second int }
247+
248+
var _ heap.Interface = (*pairs)(nil)
249+
250+
type pairs []pair
72251

252+
func (a pairs) Len() int { return len(a) }
253+
func (a pairs) Less(i int, j int) bool {
254+
return a[i].first < a[j].first || a[i].first == a[j].first && a[i].second < a[j].second
255+
}
256+
func (a pairs) Swap(i int, j int) { a[i], a[j] = a[j], a[i] }
257+
func (a *pairs) Push(x interface{}) { *a = append(*a, x.(pair)) }
258+
func (a *pairs) Pop() interface{} { l := len(*a); t := (*a)[l-1]; *a = (*a)[:l-1]; return t }
73259
```
74260

75261
### **TypeScript**

0 commit comments

Comments
 (0)