Skip to content

Commit

Permalink
feat: add solutions to lc problem: No.0239.Sliding Window Maximum
Browse files Browse the repository at this point in the history
  • Loading branch information
yanglbme committed Aug 18, 2021
1 parent c3386dc commit ce05895
Show file tree
Hide file tree
Showing 9 changed files with 266 additions and 37 deletions.
26 changes: 19 additions & 7 deletions lcof/面试题59 - I. 滑动窗口的最大值/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,20 @@

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

双端队列实现。
单调队列。

单调队列常见模型:找出滑动窗口中的最大值/最小值。模板:

```python
q = deque()
for i in range(n):
# 判断队头是否滑出窗口
while q and checkout_out(q[0]):
q.popleft()
while q and check(q[-1]):
q.pop()
q.append(i)
```

<!-- tabs:start -->

Expand All @@ -44,14 +57,13 @@
```python
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
q, res = [], []
q, res = collections.deque(), []
for i, num in enumerate(nums):
while len(q) != 0 and nums[q[-1]] <= num:
q.pop(-1)
if q and i - k + 1 > q[0]:
q.popleft()
while q and nums[q[-1]] <= num:
q.pop()
q.append(i)

if q[0] == i - k:
q = q[1:]
if i >= k - 1:
res.append(nums[q[0]])
return res
Expand Down
18 changes: 9 additions & 9 deletions lcof/面试题59 - I. 滑动窗口的最大值/Solution.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int index = 0, n = nums.length;
if (k == 0 || n == 0) {
int n = nums.length;
if (n == 0) {
return new int[0];
}
int[] res = new int[n - k + 1];
LinkedList<Integer> q = new LinkedList<>();
for (int i = 0; i < n; ++i) {
Deque<Integer> q = new LinkedList<>();
for (int i = 0, j = 0; i < n; ++i) {
if (!q.isEmpty() && i - k + 1 > q.peekFirst()) {
q.pollFirst();
}
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
q.pollLast();
}
q.addLast(i);
if (q.peekFirst() == i - k) {
q.pollFirst();
}
q.offerLast(i);
if (i >= k - 1) {
res[index++] = nums[q.peekFirst()];
res[j++] = nums[q.peekFirst()];
}
}
return res;
Expand Down
11 changes: 5 additions & 6 deletions lcof/面试题59 - I. 滑动窗口的最大值/Solution.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
q, res = [], []
q, res = collections.deque(), []
for i, num in enumerate(nums):
while len(q) != 0 and nums[q[-1]] <= num:
q.pop(-1)
if q and i - k + 1 > q[0]:
q.popleft()
while q and nums[q[-1]] <= num:
q.pop()
q.append(i)

if q[0] == i - k:
q = q[1:]
if i >= k - 1:
res.append(nums[q[0]])
return res
97 changes: 95 additions & 2 deletions solution/0200-0299/0239.Sliding Window Maximum/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,22 +70,70 @@

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

单调队列。

单调队列常见模型:找出滑动窗口中的最大值/最小值。模板:

```python
q = deque()
for i in range(n):
# 判断队头是否滑出窗口
while q and checkout_out(q[0]):
q.popleft()
while q and check(q[-1]):
q.pop()
q.append(i)
```

<!-- tabs:start -->

### **Python3**

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

```python

class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
q, res = collections.deque(), []
for i, num in enumerate(nums):
if q and i - k + 1 > q[0]:
q.popleft()
while q and nums[q[-1]] <= num:
q.pop()
q.append(i)
if i >= k - 1:
res.append(nums[q[0]])
return res
```

### **Java**

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

```java

class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
if (n == 0) {
return new int[0];
}
int[] res = new int[n - k + 1];
Deque<Integer> q = new LinkedList<>();
for (int i = 0, j = 0; i < n; ++i) {
if (!q.isEmpty() && i - k + 1 > q.peekFirst()) {
q.pollFirst();
}
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
q.pollLast();
}
q.offerLast(i);
if (i >= k - 1) {
res[j++] = nums[q.peekFirst()];
}
}
return res;
}
}
```

### **JavaScript**
Expand Down Expand Up @@ -118,6 +166,51 @@ var maxSlidingWindow = function (nums, k) {
};
```

### **C++**

```cpp
class Solution {
public:
vector<int> maxSlidingWindow(vector<int> &nums, int k) {
vector<int> res;
deque<int> q;
for (int i = 0; i < nums.size(); ++i)
{
if (!q.empty() && i - k + 1 > q.front())
q.pop_front();
while (!q.empty() && nums[q.back()] <= nums[i])
q.pop_back();
q.push_back(i);
if (i >= k - 1)
res.push_back(nums[q.front()]);
}
return res;
}
};
```
### **Go**
```go
func maxSlidingWindow(nums []int, k int) []int {
var res []int
var q []int
for i, num := range nums {
if len(q) > 0 && i-k+1 > q[0] {
q = q[1:]
}
for len(q) > 0 && nums[q[len(q)-1]] <= num {
q = q[:len(q)-1]
}
q = append(q, i)
if i >= k-1 {
res = append(res, nums[q[0]])
}
}
return res
}
```

### **...**

```
Expand Down
82 changes: 80 additions & 2 deletions solution/0200-0299/0239.Sliding Window Maximum/README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,46 @@ Window position Max
### **Python3**

```python

class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
q, res = collections.deque(), []
for i, num in enumerate(nums):
if q and i - k + 1 > q[0]:
q.popleft()
while q and nums[q[-1]] <= num:
q.pop()
q.append(i)
if i >= k - 1:
res.append(nums[q[0]])
return res
```

### **Java**

```java

class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
if (n == 0) {
return new int[0];
}
int[] res = new int[n - k + 1];
Deque<Integer> q = new LinkedList<>();
for (int i = 0, j = 0; i < n; ++i) {
if (!q.isEmpty() && i - k + 1 > q.peekFirst()) {
q.pollFirst();
}
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
q.pollLast();
}
q.offerLast(i);
if (i >= k - 1) {
res[j++] = nums[q.peekFirst()];
}
}
return res;
}
}
```

### **JavaScript**
Expand Down Expand Up @@ -109,6 +142,51 @@ var maxSlidingWindow = function (nums, k) {
};
```

### **C++**

```cpp
class Solution {
public:
vector<int> maxSlidingWindow(vector<int> &nums, int k) {
vector<int> res;
deque<int> q;
for (int i = 0; i < nums.size(); ++i)
{
if (!q.empty() && i - k + 1 > q.front())
q.pop_front();
while (!q.empty() && nums[q.back()] <= nums[i])
q.pop_back();
q.push_back(i);
if (i >= k - 1)
res.push_back(nums[q.front()]);
}
return res;
}
};
```
### **Go**
```go
func maxSlidingWindow(nums []int, k int) []int {
var res []int
var q []int
for i, num := range nums {
if len(q) > 0 && i-k+1 > q[0] {
q = q[1:]
}
for len(q) > 0 && nums[q[len(q)-1]] <= num {
q = q[:len(q)-1]
}
q = append(q, i)
if i >= k-1 {
res = append(res, nums[q[0]])
}
}
return res
}
```

### **...**

```
Expand Down
18 changes: 18 additions & 0 deletions solution/0200-0299/0239.Sliding Window Maximum/Solution.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class Solution {
public:
vector<int> maxSlidingWindow(vector<int> &nums, int k) {
vector<int> res;
deque<int> q;
for (int i = 0; i < nums.size(); ++i)
{
if (!q.empty() && i - k + 1 > q.front())
q.pop_front();
while (!q.empty() && nums[q.back()] <= nums[i])
q.pop_back();
q.push_back(i);
if (i >= k - 1)
res.push_back(nums[q.front()]);
}
return res;
}
};
17 changes: 17 additions & 0 deletions solution/0200-0299/0239.Sliding Window Maximum/Solution.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
func maxSlidingWindow(nums []int, k int) []int {
var res []int
var q []int
for i, num := range nums {
if len(q) > 0 && i-k+1 > q[0] {
q = q[1:]
}
for len(q) > 0 && nums[q[len(q)-1]] <= num {
q = q[:len(q)-1]
}
q = append(q, i)
if i >= k-1 {
res = append(res, nums[q[0]])
}
}
return res
}
22 changes: 11 additions & 11 deletions solution/0200-0299/0239.Sliding Window Maximum/Solution.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0 || k <= 0) {
int n = nums.length;
if (n == 0) {
return new int[0];
}
int[] res = new int[nums.length - k + 1];
int index = 0;
Deque<Integer> q = new ArrayDeque<>(k);
for (int i = 0; i < nums.length; ++i) {
while (!q.isEmpty() && nums[i] >= nums[q.peekLast()]) {
int[] res = new int[n - k + 1];
Deque<Integer> q = new LinkedList<>();
for (int i = 0, j = 0; i < n; ++i) {
if (!q.isEmpty() && i - k + 1 > q.peekFirst()) {
q.pollFirst();
}
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
q.pollLast();
}
q.offerLast(i);
if (i - q.peekFirst() >= k) {
q.pollFirst();
}
if (i >= k - 1) {
res[index++] = nums[q.peekFirst()];
res[j++] = nums[q.peekFirst()];
}
}
return res;
}
}
}
Loading

0 comments on commit ce05895

Please sign in to comment.