91
91
E \geq \sum_{i=1}^{n} a_i + (m_n - a_n)
92
92
$$
93
93
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$ 最大。
95
95
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)$。
97
99
98
100
<!-- tabs:start -->
99
101
104
106
``` python
105
107
class Solution :
106
108
def minimumEffort (self , tasks : List[List[int ]]) -> int :
107
- ans = t = 0
109
+ ans = cur = 0
108
110
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
113
115
return ans
114
116
```
115
117
@@ -120,14 +122,15 @@ class Solution:
120
122
``` java
121
123
class Solution {
122
124
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;
129
132
}
130
- t -= e[ 0 ] ;
133
+ cur -= a ;
131
134
}
132
135
return ans;
133
136
}
@@ -140,14 +143,15 @@ class Solution {
140
143
class Solution {
141
144
public:
142
145
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;
149
153
}
150
- t -= e [ 0 ] ;
154
+ cur -= a ;
151
155
}
152
156
return ans;
153
157
}
@@ -157,17 +161,36 @@ public:
157
161
### **Go**
158
162
159
163
```go
160
- func minimumEffort(tasks [][]int) int {
164
+ func minimumEffort(tasks [][]int) (ans int) {
161
165
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
167
172
}
168
- t -= e[0]
173
+ cur -= a
169
174
}
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 ;
171
194
}
172
195
```
173
196
0 commit comments