Skip to content

Commit 07f9173

Browse files
committed
feat: add solutions to lc problem: No.1723
No.1723.Find Minimum Time to Finish All Jobs
1 parent ff87889 commit 07f9173

File tree

11 files changed

+462
-31
lines changed

11 files changed

+462
-31
lines changed

solution/1000-1099/1090.Largest Values From Labels/README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@
6060

6161
<!-- 这里可写通用的实现逻辑 -->
6262

63+
**方法一:贪心**
64+
6365
<!-- tabs:start -->
6466

6567
### **Python3**
@@ -69,17 +71,15 @@
6971
```python
7072
class Solution:
7173
def largestValsFromLabels(self, values: List[int], labels: List[int], numWanted: int, useLimit: int) -> int:
72-
n = len(values)
73-
idx = list(range(n))
74-
idx.sort(key=lambda i: -values[i])
74+
arr = list(zip(values, labels))
75+
arr.sort(reverse=True)
76+
cnt = Counter()
7577
ans = num = 0
76-
counter = Counter()
77-
for i in idx:
78-
v, l = values[i], labels[i]
79-
if counter[l] < useLimit:
80-
counter[l] += 1
81-
ans += v
78+
for v, l in arr:
79+
if cnt[l] < useLimit:
80+
cnt[l] += 1
8281
num += 1
82+
ans += v
8383
if num == numWanted:
8484
break
8585
return ans

solution/1000-1099/1090.Largest Values From Labels/README_EN.md

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,15 @@
6161
```python
6262
class Solution:
6363
def largestValsFromLabels(self, values: List[int], labels: List[int], numWanted: int, useLimit: int) -> int:
64-
n = len(values)
65-
idx = list(range(n))
66-
idx.sort(key=lambda i: -values[i])
64+
arr = list(zip(values, labels))
65+
arr.sort(reverse=True)
66+
cnt = Counter()
6767
ans = num = 0
68-
counter = Counter()
69-
for i in idx:
70-
v, l = values[i], labels[i]
71-
if counter[l] < useLimit:
72-
counter[l] += 1
73-
ans += v
68+
for v, l in arr:
69+
if cnt[l] < useLimit:
70+
cnt[l] += 1
7471
num += 1
72+
ans += v
7573
if num == numWanted:
7674
break
7775
return ans

solution/1000-1099/1090.Largest Values From Labels/Solution.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,15 @@ class Solution:
22
def largestValsFromLabels(
33
self, values: List[int], labels: List[int], numWanted: int, useLimit: int
44
) -> int:
5-
n = len(values)
6-
idx = list(range(n))
7-
idx.sort(key=lambda i: -values[i])
5+
arr = list(zip(values, labels))
6+
arr.sort(reverse=True)
7+
cnt = Counter()
88
ans = num = 0
9-
counter = Counter()
10-
for i in idx:
11-
v, l = values[i], labels[i]
12-
if counter[l] < useLimit:
13-
counter[l] += 1
14-
ans += v
9+
for v, l in arr:
10+
if cnt[l] < useLimit:
11+
cnt[l] += 1
1512
num += 1
13+
ans += v
1614
if num == numWanted:
1715
break
1816
return ans

solution/1700-1799/1723.Find Minimum Time to Finish All Jobs/README.md

Lines changed: 152 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,173 @@
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48+
**方法一:DFS + 剪枝**
49+
50+
本题与 [2305. 公平分发饼干](/solution/2300-2399/2305.Fair%20Distribution%20of%20Cookies/README.md) 基本一致,不同的地方仅在于 $k$ 值的大小。
51+
52+
剪枝优化:优化分配花费时间较大的工作,因此可以先对 $jobs$ 按照降序排列。
53+
54+
4855
<!-- tabs:start -->
4956

5057
### **Python3**
5158

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

5461
```python
55-
62+
class Solution:
63+
def minimumTimeRequired(self, jobs: List[int], k: int) -> int:
64+
def dfs(i):
65+
nonlocal ans
66+
if i == len(jobs):
67+
ans = min(ans, max(cnt))
68+
return
69+
for j in range(k):
70+
if cnt[j] + jobs[i] >= ans:
71+
continue
72+
cnt[j] += jobs[i]
73+
dfs(i + 1)
74+
cnt[j] -= jobs[i]
75+
if cnt[j] == 0:
76+
break
77+
78+
cnt = [0] * k
79+
jobs.sort(reverse=True)
80+
ans = inf
81+
dfs(0)
82+
return ans
5683
```
5784

5885
### **Java**
5986

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

6289
```java
90+
class Solution {
91+
private int[] cnt;
92+
private int ans;
93+
private int[] jobs;
94+
private int k;
95+
96+
public int minimumTimeRequired(int[] jobs, int k) {
97+
this.k = k;
98+
Arrays.sort(jobs);
99+
for (int i = 0, j = jobs.length - 1; i < j; ++i, --j) {
100+
int t = jobs[i];
101+
jobs[i] = jobs[j];
102+
jobs[j] = t;
103+
}
104+
this.jobs = jobs;
105+
cnt = new int[k];
106+
ans = 0x3f3f3f3f;
107+
dfs(0);
108+
return ans;
109+
}
110+
111+
private void dfs(int i) {
112+
if (i == jobs.length) {
113+
int mx = 0;
114+
for (int v : cnt) {
115+
mx = Math.max(mx, v);
116+
}
117+
ans = Math.min(ans, mx);
118+
return;
119+
}
120+
for (int j = 0; j < k; ++j) {
121+
if (cnt[j] + jobs[i] >= ans) {
122+
continue;
123+
}
124+
cnt[j] += jobs[i];
125+
dfs(i + 1);
126+
cnt[j] -= jobs[i];
127+
if (cnt[j] == 0) {
128+
break;
129+
}
130+
}
131+
}
132+
}
133+
```
134+
135+
### **C++**
136+
137+
```cpp
138+
class Solution {
139+
public:
140+
int ans;
141+
142+
int minimumTimeRequired(vector<int>& jobs, int k) {
143+
vector<int> cnt(k);
144+
ans = 0x3f3f3f3f;
145+
sort(jobs.begin(), jobs.end(), greater<int>());
146+
dfs(0, k, jobs, cnt);
147+
return ans;
148+
}
149+
150+
void dfs(int i, int k, vector<int>& jobs, vector<int>& cnt) {
151+
if (i == jobs.size()) {
152+
ans = min(ans, *max_element(cnt.begin(), cnt.end()));
153+
return;
154+
}
155+
for (int j = 0; j < k; ++j)
156+
{
157+
if (cnt[j] + jobs[i] >= ans) continue;
158+
cnt[j] += jobs[i];
159+
dfs(i + 1, k, jobs, cnt);
160+
cnt[j] -= jobs[i];
161+
if (cnt[j] == 0) break;
162+
}
163+
}
164+
};
165+
```
63166
167+
### **Go**
168+
169+
```go
170+
func minimumTimeRequired(jobs []int, k int) int {
171+
cnt := make([]int, k)
172+
ans := 0x3f3f3f3f
173+
sort.Slice(jobs, func(i, j int) bool {
174+
return jobs[i] > jobs[j]
175+
})
176+
var dfs func(int)
177+
dfs = func(i int) {
178+
if i == len(jobs) {
179+
mx := 0
180+
for _, v := range cnt {
181+
mx = max(mx, v)
182+
}
183+
ans = min(ans, mx)
184+
return
185+
}
186+
for j := 0; j < k; j++ {
187+
if cnt[j]+jobs[i] >= ans {
188+
continue
189+
}
190+
cnt[j] += jobs[i]
191+
dfs(i + 1)
192+
cnt[j] -= jobs[i]
193+
if cnt[j] == 0 {
194+
break
195+
}
196+
}
197+
}
198+
dfs(0)
199+
return ans
200+
}
201+
202+
func max(a, b int) int {
203+
if a > b {
204+
return a
205+
}
206+
return b
207+
}
208+
209+
func min(a, b int) int {
210+
if a < b {
211+
return a
212+
}
213+
return b
214+
}
64215
```
65216

66217
### **...**

0 commit comments

Comments
 (0)