@@ -1188,4 +1188,238 @@ class Deque<T> {
1188
1188
1189
1189
<!-- solution: end -->
1190
1190
1191
+ <!-- solution: start -->
1192
+
1193
+ ### 方法三:滑动窗口 + 双向队列
1194
+
1195
+ 我们可以使用双向队列维护窗口内的最大值和最小值。我们维护两个双向队列,分别存储窗口内的最大值和最小值的下标。定义两个指针 $l$ 和 $r$ 分别指向窗口的左边界和右边界。
1196
+
1197
+ 每次向右移动右边界 $r$,判断最大值队列的队尾下标对应的元素是否小于当前元素,如果小于,则将队尾元素出队,直到最大值队列的队尾元素对应的元素不小于当前元素。同理,判断最小值队列的队尾下标对应的元素是否大于当前元素,如果大于,则将队尾元素出队,直到最小值队列的队尾元素对应的元素不大于当前元素。然后,将当前元素的下标入队。
1198
+
1199
+ 如果最大值队列的队首元素和最小值队列的队首元素的差值大于 $limit$,则向右移动左边界 $l$,然后如果最大值队列的队首元素小于 $l$,则将最大值队列的队首元素出队,如果最小值队列的队首元素小于 $l$,则将最小值队列的队首元素出队。
1200
+
1201
+ 答案为 $n - l$。
1202
+
1203
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 $nums$ 的长度。
1204
+
1205
+ <!-- tabs: start -->
1206
+
1207
+ #### Python3
1208
+
1209
+ ``` python
1210
+ class Solution :
1211
+ def longestSubarray (self , nums : List[int ], limit : int ) -> int :
1212
+ maxq = deque()
1213
+ minq = deque()
1214
+ l, n = 0 , len (nums)
1215
+ for r, x in enumerate (nums):
1216
+ while maxq and nums[maxq[- 1 ]] < x:
1217
+ maxq.pop()
1218
+ while minq and nums[minq[- 1 ]] > x:
1219
+ minq.pop()
1220
+ maxq.append(r)
1221
+ minq.append(r)
1222
+ if nums[maxq[0 ]] - nums[minq[0 ]] > limit:
1223
+ l += 1
1224
+ if maxq[0 ] < l:
1225
+ maxq.popleft()
1226
+ if minq[0 ] < l:
1227
+ minq.popleft()
1228
+ return n - l
1229
+ ```
1230
+
1231
+ #### Java
1232
+
1233
+ ``` java
1234
+ class Solution {
1235
+ public int longestSubarray (int [] nums , int limit ) {
1236
+ Deque<Integer > maxQ = new ArrayDeque<> ();
1237
+ Deque<Integer > minQ = new ArrayDeque<> ();
1238
+ int n = nums. length;
1239
+ int l = 0 ;
1240
+ for (int r = 0 ; r < n; ++ r) {
1241
+ while (! maxQ. isEmpty() && nums[maxQ. peekLast()] < nums[r]) {
1242
+ maxQ. pollLast();
1243
+ }
1244
+ while (! minQ. isEmpty() && nums[minQ. peekLast()] > nums[r]) {
1245
+ minQ. pollLast();
1246
+ }
1247
+ maxQ. offerLast(r);
1248
+ minQ. offerLast(r);
1249
+ if (nums[maxQ. peekFirst()] - nums[minQ. peekFirst()] > limit) {
1250
+ ++ l;
1251
+ if (maxQ. peekFirst() < l) {
1252
+ maxQ. pollFirst();
1253
+ }
1254
+ if (minQ. peekFirst() < l) {
1255
+ minQ. pollFirst();
1256
+ }
1257
+ }
1258
+ }
1259
+ return n - l;
1260
+ }
1261
+ }
1262
+ ```
1263
+
1264
+ #### C++
1265
+
1266
+ ``` cpp
1267
+ class Solution {
1268
+ public:
1269
+ int longestSubarray(vector<int >& nums, int limit) {
1270
+ deque<int > max_q;
1271
+ deque<int > min_q;
1272
+ int n = nums.size();
1273
+ int l = 0;
1274
+
1275
+ for (int r = 0; r < n; ++r) {
1276
+ while (!max_q.empty() && nums[max_q.back()] < nums[r]) {
1277
+ max_q.pop_back();
1278
+ }
1279
+ while (!min_q.empty() && nums[min_q.back()] > nums[r]) {
1280
+ min_q.pop_back();
1281
+ }
1282
+ max_q.push_back(r);
1283
+ min_q.push_back(r);
1284
+
1285
+ if (nums[max_q.front()] - nums[min_q.front()] > limit) {
1286
+ ++l;
1287
+ if (max_q.front() < l) {
1288
+ max_q.pop_front();
1289
+ }
1290
+ if (min_q.front() < l) {
1291
+ min_q.pop_front();
1292
+ }
1293
+ }
1294
+ }
1295
+ return n - l;
1296
+ }
1297
+ };
1298
+ ```
1299
+
1300
+ #### Go
1301
+
1302
+ ``` go
1303
+ func longestSubarray (nums []int , limit int ) int {
1304
+ var maxq , minq Deque
1305
+ n := len (nums)
1306
+ l := 0
1307
+ for r , x := range nums {
1308
+ for !maxq.Empty () && nums[maxq.Back ()] < x {
1309
+ maxq.PopBack ()
1310
+ }
1311
+ for !minq.Empty () && nums[minq.Back ()] > x {
1312
+ minq.PopBack ()
1313
+ }
1314
+ maxq.PushBack (r)
1315
+ minq.PushBack (r)
1316
+
1317
+ if nums[maxq.Front ()]-nums[minq.Front ()] > limit {
1318
+ l++
1319
+ if maxq.Front () < l {
1320
+ maxq.PopFront ()
1321
+ }
1322
+ if minq.Front () < l {
1323
+ minq.PopFront ()
1324
+ }
1325
+ }
1326
+ }
1327
+ return n - l
1328
+ }
1329
+
1330
+ type Deque struct { l, r []int }
1331
+
1332
+ func (q Deque ) Empty () bool {
1333
+ return len (q.l ) == 0 && len (q.r ) == 0
1334
+ }
1335
+
1336
+ func (q Deque ) Size () int {
1337
+ return len (q.l ) + len (q.r )
1338
+ }
1339
+
1340
+ func (q *Deque ) PushFront (v int ) {
1341
+ q.l = append (q.l , v)
1342
+ }
1343
+
1344
+ func (q *Deque ) PushBack (v int ) {
1345
+ q.r = append (q.r , v)
1346
+ }
1347
+
1348
+ func (q *Deque ) PopFront () (v int ) {
1349
+ if len (q.l ) > 0 {
1350
+ q.l , v = q.l [:len (q.l )-1 ], q.l [len (q.l )-1 ]
1351
+ } else {
1352
+ v, q.r = q.r [0 ], q.r [1 :]
1353
+ }
1354
+ return
1355
+ }
1356
+
1357
+ func (q *Deque ) PopBack () (v int ) {
1358
+ if len (q.r ) > 0 {
1359
+ q.r , v = q.r [:len (q.r )-1 ], q.r [len (q.r )-1 ]
1360
+ } else {
1361
+ v, q.l = q.l [0 ], q.l [1 :]
1362
+ }
1363
+ return
1364
+ }
1365
+
1366
+ func (q Deque ) Front () int {
1367
+ if len (q.l ) > 0 {
1368
+ return q.l [len (q.l )-1 ]
1369
+ }
1370
+ return q.r [0 ]
1371
+ }
1372
+
1373
+ func (q Deque ) Back () int {
1374
+ if len (q.r ) > 0 {
1375
+ return q.r [len (q.r )-1 ]
1376
+ }
1377
+ return q.l [0 ]
1378
+ }
1379
+
1380
+ func (q Deque ) Get (i int ) int {
1381
+ if i < len (q.l ) {
1382
+ return q.l [len (q.l )-1 -i]
1383
+ }
1384
+ return q.r [i-len (q.l )]
1385
+ }
1386
+ ```
1387
+
1388
+ #### TypeScript
1389
+
1390
+ ``` ts
1391
+ function longestSubarray(nums : number [], limit : number ): number {
1392
+ const n = nums .length ;
1393
+ let [h1, t1] = [0 , - 1 ];
1394
+ let [h2, t2] = [0 , - 1 ];
1395
+ let l = 0 ;
1396
+ const maxq = Array (n );
1397
+ const minq = Array (n );
1398
+ for (let r = 0 ; r < n ; ++ r ) {
1399
+ while (h1 <= t1 && nums [maxq [t1 ]] < nums [r ]) {
1400
+ -- t1 ;
1401
+ }
1402
+ while (h2 <= t2 && nums [minq [t2 ]] > nums [r ]) {
1403
+ -- t2 ;
1404
+ }
1405
+ maxq [++ t1 ] = r ;
1406
+ minq [++ t2 ] = r ;
1407
+ if (nums [maxq [h1 ]] - nums [minq [h2 ]] > limit ) {
1408
+ ++ l ;
1409
+ if (maxq [h1 ] < l ) {
1410
+ ++ h1 ;
1411
+ }
1412
+ if (minq [h2 ] < l ) {
1413
+ ++ h2 ;
1414
+ }
1415
+ }
1416
+ }
1417
+ return n - l ;
1418
+ }
1419
+ ```
1420
+
1421
+ <!-- tabs: end -->
1422
+
1423
+ <!-- solution: end -->
1424
+
1191
1425
<!-- problem: end -->
0 commit comments