Skip to content

Commit e5a785b

Browse files
committed
feat: add solutions to lc problem: No.1710
No.1710.Maximum Units on a Truck
1 parent f6ef5cf commit e5a785b

File tree

2 files changed

+214
-0
lines changed

2 files changed

+214
-0
lines changed

solution/1700-1799/1710.Maximum Units on a Truck/README.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@
6060

6161
时间复杂度 $O(n\times \log n)$,其中 $n$ 表示二维数组 `boxTypes` 的长度。
6262

63+
**方法二:计数排序**
64+
65+
我们还可以利用计数排序的思想,开一个长度为 $1001$ 的数组 $cnt$,其中 $cnt[b]$ 表示单元数为 $b$ 的箱子的数量。
66+
67+
然后从单元数最大的箱子开始,选择最多 `truckSize` 个箱子,累加单元数。
68+
69+
时间复杂度 $O(M)$,其中 $M$ 是单元数的最大值。本题中 $M=1000$。
70+
6371
<!-- tabs:start -->
6472

6573
### **Python3**
@@ -78,6 +86,23 @@ class Solution:
7886
return ans
7987
```
8088

89+
```python
90+
class Solution:
91+
def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:
92+
cnt = [0] * 1001
93+
for a, b in boxTypes:
94+
cnt[b] += a
95+
ans = 0
96+
for b in range(1000, 0, -1):
97+
a = cnt[b]
98+
if a:
99+
ans += b * min(truckSize, a)
100+
truckSize -= a
101+
if truckSize <= 0:
102+
break
103+
return ans
104+
```
105+
81106
### **Java**
82107

83108
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -100,6 +125,27 @@ class Solution {
100125
}
101126
```
102127

128+
```java
129+
class Solution {
130+
public int maximumUnits(int[][] boxTypes, int truckSize) {
131+
int[] cnt = new int[1001];
132+
for (var e : boxTypes) {
133+
int a = e[0], b = e[1];
134+
cnt[b] += a;
135+
}
136+
int ans = 0;
137+
for (int b = 1000; b > 0 && truckSize > 0; --b) {
138+
int a = cnt[b];
139+
if (a > 0) {
140+
ans += b * Math.min(truckSize, a);
141+
truckSize -= a;
142+
}
143+
}
144+
return ans;
145+
}
146+
}
147+
```
148+
103149
### **C++**
104150

105151
```cpp
@@ -119,6 +165,28 @@ public:
119165
};
120166
```
121167
168+
```cpp
169+
class Solution {
170+
public:
171+
int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) {
172+
int cnt[1001] = {0};
173+
for (auto& e : boxTypes) {
174+
int a = e[0], b = e[1];
175+
cnt[b] += a;
176+
}
177+
int ans = 0;
178+
for (int b = 1000; b > 0 && truckSize > 0; --b) {
179+
int a = cnt[b];
180+
if (a) {
181+
ans += b * min(truckSize, a);
182+
truckSize -= a;
183+
}
184+
}
185+
return ans;
186+
}
187+
};
188+
```
189+
122190
### **Go**
123191

124192
```go
@@ -143,6 +211,31 @@ func min(a, b int) int {
143211
}
144212
```
145213

214+
```go
215+
func maximumUnits(boxTypes [][]int, truckSize int) (ans int) {
216+
cnt := [1001]int{}
217+
for _, e := range boxTypes {
218+
a, b := e[0], e[1]
219+
cnt[b] += a
220+
}
221+
for b := 1000; b > 0 && truckSize > 0; b-- {
222+
a := cnt[b]
223+
if a > 0 {
224+
ans += b * min(truckSize, a)
225+
truckSize -= a
226+
}
227+
}
228+
return
229+
}
230+
231+
func min(a, b int) int {
232+
if a < b {
233+
return a
234+
}
235+
return b
236+
}
237+
```
238+
146239
### **TypeScript**
147240

148241
```ts
@@ -163,6 +256,24 @@ function maximumUnits(boxTypes: number[][], truckSize: number): number {
163256
}
164257
```
165258

259+
```ts
260+
function maximumUnits(boxTypes: number[][], truckSize: number): number {
261+
const cnt = new Array(1001).fill(0);
262+
for (const [a, b] of boxTypes) {
263+
cnt[b] += a;
264+
}
265+
let ans = 0;
266+
for (let b = 1000; b > 0 && truckSize > 0; --b) {
267+
const a = cnt[b];
268+
if (a > 0) {
269+
ans += b * Math.min(truckSize, a);
270+
truckSize -= a;
271+
}
272+
}
273+
return ans;
274+
}
275+
```
276+
166277
### **Rust**
167278

168279
```rust

solution/1700-1799/1710.Maximum Units on a Truck/README_EN.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,23 @@ class Solution:
6363
return ans
6464
```
6565

66+
```python
67+
class Solution:
68+
def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:
69+
cnt = [0] * 1001
70+
for a, b in boxTypes:
71+
cnt[b] += a
72+
ans = 0
73+
for b in range(1000, 0, -1):
74+
a = cnt[b]
75+
if a:
76+
ans += b * min(truckSize, a)
77+
truckSize -= a
78+
if truckSize <= 0:
79+
break
80+
return ans
81+
```
82+
6683
### **Java**
6784

6885
```java
@@ -83,6 +100,27 @@ class Solution {
83100
}
84101
```
85102

103+
```java
104+
class Solution {
105+
public int maximumUnits(int[][] boxTypes, int truckSize) {
106+
int[] cnt = new int[1001];
107+
for (var e : boxTypes) {
108+
int a = e[0], b = e[1];
109+
cnt[b] += a;
110+
}
111+
int ans = 0;
112+
for (int b = 1000; b > 0 && truckSize > 0; --b) {
113+
int a = cnt[b];
114+
if (a > 0) {
115+
ans += b * Math.min(truckSize, a);
116+
truckSize -= a;
117+
}
118+
}
119+
return ans;
120+
}
121+
}
122+
```
123+
86124
### **C++**
87125

88126
```cpp
@@ -102,6 +140,28 @@ public:
102140
};
103141
```
104142
143+
```cpp
144+
class Solution {
145+
public:
146+
int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) {
147+
int cnt[1001] = {0};
148+
for (auto& e : boxTypes) {
149+
int a = e[0], b = e[1];
150+
cnt[b] += a;
151+
}
152+
int ans = 0;
153+
for (int b = 1000; b > 0 && truckSize > 0; --b) {
154+
int a = cnt[b];
155+
if (a) {
156+
ans += b * min(truckSize, a);
157+
truckSize -= a;
158+
}
159+
}
160+
return ans;
161+
}
162+
};
163+
```
164+
105165
### **Go**
106166

107167
```go
@@ -126,6 +186,31 @@ func min(a, b int) int {
126186
}
127187
```
128188

189+
```go
190+
func maximumUnits(boxTypes [][]int, truckSize int) (ans int) {
191+
cnt := [1001]int{}
192+
for _, e := range boxTypes {
193+
a, b := e[0], e[1]
194+
cnt[b] += a
195+
}
196+
for b := 1000; b > 0 && truckSize > 0; b-- {
197+
a := cnt[b]
198+
if a > 0 {
199+
ans += b * min(truckSize, a)
200+
truckSize -= a
201+
}
202+
}
203+
return
204+
}
205+
206+
func min(a, b int) int {
207+
if a < b {
208+
return a
209+
}
210+
return b
211+
}
212+
```
213+
129214
### **TypeScript**
130215

131216
```ts
@@ -146,6 +231,24 @@ function maximumUnits(boxTypes: number[][], truckSize: number): number {
146231
}
147232
```
148233

234+
```ts
235+
function maximumUnits(boxTypes: number[][], truckSize: number): number {
236+
const cnt = new Array(1001).fill(0);
237+
for (const [a, b] of boxTypes) {
238+
cnt[b] += a;
239+
}
240+
let ans = 0;
241+
for (let b = 1000; b > 0 && truckSize > 0; --b) {
242+
const a = cnt[b];
243+
if (a > 0) {
244+
ans += b * Math.min(truckSize, a);
245+
truckSize -= a;
246+
}
247+
}
248+
return ans;
249+
}
250+
```
251+
149252
### **Rust**
150253

151254
```rust

0 commit comments

Comments
 (0)