Skip to content

Commit 06ffca3

Browse files
committed
feat: add solutions to lc problem: No.1665
No.1665.Minimum Initial Energy to Finish Tasks
1 parent a768b72 commit 06ffca3

File tree

7 files changed

+143
-83
lines changed

7 files changed

+143
-83
lines changed

solution/1600-1699/1665.Minimum Initial Energy to Finish Tasks/README.md

+52-29
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,11 @@ $$
9191
E \geq \sum_{i=1}^{n} a_i + (m_n - a_n)
9292
$$
9393

94-
其中 $\sum_{i=1}^{n} a_i$ 是固定不变的,要使得初始值能量值 $E$ 最小,我们需要让 $m_n - a_n$ 最小,即 $a_n-m_n$ 最大。因此,我们可以将任务按照 $a_n-m_n$ 从小到大排序,然后依次完成任务,算出所需要的初始能量值。
94+
其中 $\sum_{i=1}^{n} a_i$ 是固定不变的,要使得初始值能量值 $E$ 最小,我们需要让 $m_n - a_n$ 最小,即 $a_n-m_n$ 最大。
9595

96-
时间复杂度 $O(n\times \log n)$。其中 $n$ 为任务数。
96+
因此,我们可以将任务按照 $a_i-m_i$ 从小到大排序。然后从前往后遍历任务,对于每个任务,如果当前能量值 $cur$ 小于 $m_i$,则需要增加能量值 $m_i - cur$,使得当前能量值刚好等于 $m_i$,然后再完成任务,更新 $cur = cur - a_i$。继续遍历,直到完成所有任务,即可得到初始所需的最少能量值。
97+
98+
时间复杂度 $O(n\times \log n)$。其中 $n$ 为任务数。忽略排序的空间开销,空间复杂度 $O(1)$。
9799

98100
<!-- tabs:start -->
99101

@@ -104,12 +106,12 @@ $$
104106
```python
105107
class Solution:
106108
def minimumEffort(self, tasks: List[List[int]]) -> int:
107-
ans = t = 0
109+
ans = cur = 0
108110
for a, m in sorted(tasks, key=lambda x: x[0] - x[1]):
109-
if t < m:
110-
ans += m - t
111-
t = m
112-
t -= a
111+
if cur < m:
112+
ans += m - cur
113+
cur = m
114+
cur -= a
113115
return ans
114116
```
115117

@@ -120,14 +122,15 @@ class Solution:
120122
```java
121123
class Solution {
122124
public int minimumEffort(int[][] tasks) {
123-
Arrays.sort(tasks, (a, b) -> a[0] - b[0] - a[1] + b[1]);
124-
int ans = 0, t = 0;
125-
for (var e : tasks) {
126-
if (t < e[1]) {
127-
ans += e[1] - t;
128-
t = e[1];
125+
Arrays.sort(tasks, (a, b) -> a[0] - b[0] - (a[1] - b[1]));
126+
int ans = 0, cur = 0;
127+
for (var task : tasks) {
128+
int a = task[0], m = task[1];
129+
if (cur < m) {
130+
ans += m - cur;
131+
cur = m;
129132
}
130-
t -= e[0];
133+
cur -= a;
131134
}
132135
return ans;
133136
}
@@ -140,14 +143,15 @@ class Solution {
140143
class Solution {
141144
public:
142145
int minimumEffort(vector<vector<int>>& tasks) {
143-
sort(tasks.begin(), tasks.end(), [&](auto& a, auto& b) -> bool { return a[0] - a[1] < b[0] - b[1]; });
144-
int ans = 0, t = 0;
145-
for (auto& e : tasks) {
146-
if (t < e[1]) {
147-
ans += e[1] - t;
148-
t = e[1];
146+
sort(tasks.begin(), tasks.end(), [&](const auto& a, const auto& b) { return a[0] - a[1] < b[0] - b[1]; });
147+
int ans = 0, cur = 0;
148+
for (auto& task : tasks) {
149+
int a = task[0], m = task[1];
150+
if (cur < m) {
151+
ans += m - cur;
152+
cur = m;
149153
}
150-
t -= e[0];
154+
cur -= a;
151155
}
152156
return ans;
153157
}
@@ -157,17 +161,36 @@ public:
157161
### **Go**
158162
159163
```go
160-
func minimumEffort(tasks [][]int) int {
164+
func minimumEffort(tasks [][]int) (ans int) {
161165
sort.Slice(tasks, func(i, j int) bool { return tasks[i][0]-tasks[i][1] < tasks[j][0]-tasks[j][1] })
162-
var ans, t int
163-
for _, e := range tasks {
164-
if t < e[1] {
165-
ans += e[1] - t
166-
t = e[1]
166+
cur := 0
167+
for _, task := range tasks {
168+
a, m := task[0], task[1]
169+
if cur < m {
170+
ans += m - cur
171+
cur = m
167172
}
168-
t -= e[0]
173+
cur -= a
169174
}
170-
return ans
175+
return
176+
}
177+
```
178+
179+
### **TypeScript**
180+
181+
```ts
182+
function minimumEffort(tasks: number[][]): number {
183+
tasks.sort((a, b) => a[0] - a[1] - (b[0] - b[1]));
184+
let ans = 0;
185+
let cur = 0;
186+
for (const [a, m] of tasks) {
187+
if (cur < m) {
188+
ans += m - cur;
189+
cur = m;
190+
}
191+
cur -= a;
192+
}
193+
return ans;
171194
}
172195
```
173196

solution/1600-1699/1665.Minimum Initial Energy to Finish Tasks/README_EN.md

+48-27
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,12 @@ Starting with 27 energy, we finish the tasks in the following order:
7575
```python
7676
class Solution:
7777
def minimumEffort(self, tasks: List[List[int]]) -> int:
78-
ans = t = 0
78+
ans = cur = 0
7979
for a, m in sorted(tasks, key=lambda x: x[0] - x[1]):
80-
if t < m:
81-
ans += m - t
82-
t = m
83-
t -= a
80+
if cur < m:
81+
ans += m - cur
82+
cur = m
83+
cur -= a
8484
return ans
8585
```
8686

@@ -89,14 +89,15 @@ class Solution:
8989
```java
9090
class Solution {
9191
public int minimumEffort(int[][] tasks) {
92-
Arrays.sort(tasks, (a, b) -> a[0] - b[0] - a[1] + b[1]);
93-
int ans = 0, t = 0;
94-
for (var e : tasks) {
95-
if (t < e[1]) {
96-
ans += e[1] - t;
97-
t = e[1];
92+
Arrays.sort(tasks, (a, b) -> a[0] - b[0] - (a[1] - b[1]));
93+
int ans = 0, cur = 0;
94+
for (var task : tasks) {
95+
int a = task[0], m = task[1];
96+
if (cur < m) {
97+
ans += m - cur;
98+
cur = m;
9899
}
99-
t -= e[0];
100+
cur -= a;
100101
}
101102
return ans;
102103
}
@@ -109,14 +110,15 @@ class Solution {
109110
class Solution {
110111
public:
111112
int minimumEffort(vector<vector<int>>& tasks) {
112-
sort(tasks.begin(), tasks.end(), [&](auto& a, auto& b) -> bool { return a[0] - a[1] < b[0] - b[1]; });
113-
int ans = 0, t = 0;
114-
for (auto& e : tasks) {
115-
if (t < e[1]) {
116-
ans += e[1] - t;
117-
t = e[1];
113+
sort(tasks.begin(), tasks.end(), [&](const auto& a, const auto& b) { return a[0] - a[1] < b[0] - b[1]; });
114+
int ans = 0, cur = 0;
115+
for (auto& task : tasks) {
116+
int a = task[0], m = task[1];
117+
if (cur < m) {
118+
ans += m - cur;
119+
cur = m;
118120
}
119-
t -= e[0];
121+
cur -= a;
120122
}
121123
return ans;
122124
}
@@ -126,17 +128,36 @@ public:
126128
### **Go**
127129
128130
```go
129-
func minimumEffort(tasks [][]int) int {
131+
func minimumEffort(tasks [][]int) (ans int) {
130132
sort.Slice(tasks, func(i, j int) bool { return tasks[i][0]-tasks[i][1] < tasks[j][0]-tasks[j][1] })
131-
var ans, t int
132-
for _, e := range tasks {
133-
if t < e[1] {
134-
ans += e[1] - t
135-
t = e[1]
133+
cur := 0
134+
for _, task := range tasks {
135+
a, m := task[0], task[1]
136+
if cur < m {
137+
ans += m - cur
138+
cur = m
136139
}
137-
t -= e[0]
140+
cur -= a
138141
}
139-
return ans
142+
return
143+
}
144+
```
145+
146+
### **TypeScript**
147+
148+
```ts
149+
function minimumEffort(tasks: number[][]): number {
150+
tasks.sort((a, b) => a[0] - a[1] - (b[0] - b[1]));
151+
let ans = 0;
152+
let cur = 0;
153+
for (const [a, m] of tasks) {
154+
if (cur < m) {
155+
ans += m - cur;
156+
cur = m;
157+
}
158+
cur -= a;
159+
}
160+
return ans;
140161
}
141162
```
142163

solution/1600-1699/1665.Minimum Initial Energy to Finish Tasks/Solution.cpp

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
class Solution {
22
public:
33
int minimumEffort(vector<vector<int>>& tasks) {
4-
sort(tasks.begin(), tasks.end(), [&](auto& a, auto& b) -> bool { return a[0] - a[1] < b[0] - b[1]; });
5-
int ans = 0, t = 0;
6-
for (auto& e : tasks) {
7-
if (t < e[1]) {
8-
ans += e[1] - t;
9-
t = e[1];
4+
sort(tasks.begin(), tasks.end(), [&](const auto& a, const auto& b) { return a[0] - a[1] < b[0] - b[1]; });
5+
int ans = 0, cur = 0;
6+
for (auto& task : tasks) {
7+
int a = task[0], m = task[1];
8+
if (cur < m) {
9+
ans += m - cur;
10+
cur = m;
1011
}
11-
t -= e[0];
12+
cur -= a;
1213
}
1314
return ans;
1415
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
func minimumEffort(tasks [][]int) int {
1+
func minimumEffort(tasks [][]int) (ans int) {
22
sort.Slice(tasks, func(i, j int) bool { return tasks[i][0]-tasks[i][1] < tasks[j][0]-tasks[j][1] })
3-
var ans, t int
4-
for _, e := range tasks {
5-
if t < e[1] {
6-
ans += e[1] - t
7-
t = e[1]
3+
cur := 0
4+
for _, task := range tasks {
5+
a, m := task[0], task[1]
6+
if cur < m {
7+
ans += m - cur
8+
cur = m
89
}
9-
t -= e[0]
10+
cur -= a
1011
}
11-
return ans
12+
return
1213
}

solution/1600-1699/1665.Minimum Initial Energy to Finish Tasks/Solution.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
class Solution {
22
public int minimumEffort(int[][] tasks) {
3-
Arrays.sort(tasks, (a, b) -> a[0] - b[0] - a[1] + b[1]);
4-
int ans = 0, t = 0;
5-
for (var e : tasks) {
6-
if (t < e[1]) {
7-
ans += e[1] - t;
8-
t = e[1];
3+
Arrays.sort(tasks, (a, b) -> a[0] - b[0] - (a[1] - b[1]));
4+
int ans = 0, cur = 0;
5+
for (var task : tasks) {
6+
int a = task[0], m = task[1];
7+
if (cur < m) {
8+
ans += m - cur;
9+
cur = m;
910
}
10-
t -= e[0];
11+
cur -= a;
1112
}
1213
return ans;
1314
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
class Solution:
22
def minimumEffort(self, tasks: List[List[int]]) -> int:
3-
ans = t = 0
3+
ans = cur = 0
44
for a, m in sorted(tasks, key=lambda x: x[0] - x[1]):
5-
if t < m:
6-
ans += m - t
7-
t = m
8-
t -= a
5+
if cur < m:
6+
ans += m - cur
7+
cur = m
8+
cur -= a
99
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function minimumEffort(tasks: number[][]): number {
2+
tasks.sort((a, b) => a[0] - a[1] - (b[0] - b[1]));
3+
let ans = 0;
4+
let cur = 0;
5+
for (const [a, m] of tasks) {
6+
if (cur < m) {
7+
ans += m - cur;
8+
cur = m;
9+
}
10+
cur -= a;
11+
}
12+
return ans;
13+
}

0 commit comments

Comments
 (0)