Skip to content

Commit 3fd9474

Browse files
committed
feat: add solutions to lc problem: No.1665
No.1665.Minimum Initial Energy to Finish Tasks
1 parent be3a604 commit 3fd9474

File tree

6 files changed

+192
-2
lines changed

6 files changed

+192
-2
lines changed

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

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,104 @@
7171

7272
<!-- 这里可写通用的实现逻辑 -->
7373

74+
**方法一:贪心 + 自定义排序**
75+
76+
我们假设任务数为 $n$,初始能量值为 $E$,考虑完成最后一个任务,这需要我们完成前 $n-1$ 个任务后,剩余的能量值不小于完成最后一个任务需要达到的能量值 $m_n$,即:
77+
78+
$$
79+
E-\sum_{i=1}^{n-1} a_i \geq m_n
80+
$$
81+
82+
我们可以将 $m_n$ 表示成 $a_n+(m_n - a_n)$,然后将上面的式子变形,得到:
83+
84+
$$
85+
E-\sum_{i=1}^{n-1} a_i \geq a_n+(m_n - a_n)
86+
$$
87+
88+
整理可得:
89+
90+
$$
91+
E \geq \sum_{i=1}^{n} a_i + (m_n - a_n)
92+
$$
93+
94+
其中 $\sum_{i=1}^{n} a_i$ 是固定不变的,要使得初始值能量值 $E$ 最小,我们需要让 $m_n - a_n$ 最小,即 $a_n-m_n$ 最大。因此,我们可以将任务按照 $a_n-m_n$ 从小到大排序,然后依次完成任务,算出所需要的初始能量值。
95+
96+
时间复杂度 $O(n\times \log n)$。其中 $n$ 为任务数。
97+
7498
<!-- tabs:start -->
7599

76100
### **Python3**
77101

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

80104
```python
81-
105+
class Solution:
106+
def minimumEffort(self, tasks: List[List[int]]) -> int:
107+
ans = t = 0
108+
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
113+
return ans
82114
```
83115

84116
### **Java**
85117

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

88120
```java
121+
class Solution {
122+
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];
129+
}
130+
t -= e[0];
131+
}
132+
return ans;
133+
}
134+
}
135+
```
136+
137+
### **C++**
138+
139+
```cpp
140+
class Solution {
141+
public:
142+
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];
149+
}
150+
t -= e[0];
151+
}
152+
return ans;
153+
}
154+
};
155+
```
89156
157+
### **Go**
158+
159+
```go
160+
func minimumEffort(tasks [][]int) int {
161+
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]
167+
}
168+
t -= e[0]
169+
}
170+
return ans
171+
}
90172
```
91173

92174
### **...**

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

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,71 @@ Starting with 27 energy, we finish the tasks in the following order:
7373
### **Python3**
7474

7575
```python
76-
76+
class Solution:
77+
def minimumEffort(self, tasks: List[List[int]]) -> int:
78+
ans = t = 0
79+
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
84+
return ans
7785
```
7886

7987
### **Java**
8088

8189
```java
90+
class Solution {
91+
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];
98+
}
99+
t -= e[0];
100+
}
101+
return ans;
102+
}
103+
}
104+
```
105+
106+
### **C++**
107+
108+
```cpp
109+
class Solution {
110+
public:
111+
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];
118+
}
119+
t -= e[0];
120+
}
121+
return ans;
122+
}
123+
};
124+
```
82125
126+
### **Go**
127+
128+
```go
129+
func minimumEffort(tasks [][]int) int {
130+
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]
136+
}
137+
t -= e[0]
138+
}
139+
return ans
140+
}
83141
```
84142

85143
### **...**
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
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];
10+
}
11+
t -= e[0];
12+
}
13+
return ans;
14+
}
15+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
func minimumEffort(tasks [][]int) int {
2+
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]
8+
}
9+
t -= e[0]
10+
}
11+
return ans
12+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
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];
9+
}
10+
t -= e[0];
11+
}
12+
return ans;
13+
}
14+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def minimumEffort(self, tasks: List[List[int]]) -> int:
3+
ans = t = 0
4+
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
9+
return ans

0 commit comments

Comments
 (0)