Skip to content

Commit 5be8a6f

Browse files
rain84yanglbme
andauthored
feat: add solutions to lc problem: No.1438 (#3160)
Co-authored-by: Libin YANG <[email protected]>
1 parent c1ace34 commit 5be8a6f

File tree

7 files changed

+657
-0
lines changed

7 files changed

+657
-0
lines changed

solution/1400-1499/1438.Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit/README.md

+234
Original file line numberDiff line numberDiff line change
@@ -1188,4 +1188,238 @@ class Deque<T> {
11881188

11891189
<!-- solution:end -->
11901190

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+
11911425
<!-- problem:end -->

0 commit comments

Comments
 (0)