-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMain59I.java
More file actions
96 lines (90 loc) · 2.75 KB
/
Main59I.java
File metadata and controls
96 lines (90 loc) · 2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package JZOffer2;
import java.util.ArrayDeque;
import java.util.Comparator;
import java.util.Deque;
import java.util.PriorityQueue;
/**
* 单调队列
*/
public class Main59I {
public static int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 1){
return new int[]{nums[0]};
}
int[] result = new int[nums.length - k + 1];
Deque<Integer> queue = new ArrayDeque<>();
queue.add(nums[0]);
for (int i = 1; i < k; i++) {
while(!queue.isEmpty() && queue.peekLast() < nums[i])
queue.removeLast();
queue.addLast(nums[i]);
}
result[0] = queue.getFirst();
for (int i = k; i < nums.length; i++) {
if(queue.peekFirst() == nums[i - k])
queue.removeFirst();
while(!queue.isEmpty() && queue.peekLast() < nums[i])
queue.removeLast();
queue.addLast(nums[i]);
result[i - k + 1] = queue.peekFirst();
}
return result;
}
public static void main(String[] args) {
int[] nums = new int[]{7,2,4};
maxSlidingWindow(nums, 2);
}
}
/**
* 优先队列
*/
class Main59I_1{
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {
public int compare(int[] pair1, int[] pair2) {
return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];
}
});
for (int i = 0; i < k; ++i) {
pq.offer(new int[]{nums[i], i});
}
int[] ans = new int[n - k + 1];
ans[0] = pq.peek()[0];
for (int i = k; i < n; ++i) {
pq.offer(new int[]{nums[i], i});
while (pq.peek()[1] <= i - k) {
pq.poll();
}
ans[i - k + 1] = pq.peek()[0];
}
return ans;
}
}
class Main59I_2{
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
int[] prefixMax = new int[n];
int[] suffixMax = new int[n];
for (int i = 0; i < n; i++) {
if (i % k == 0) {
prefixMax[i] = nums[i];
}
else {
prefixMax[i] = Math.max(prefixMax[i - 1], nums[i]);
}
}
for (int i = n - 1; i >= 0; --i) {
if (i == n - 1 || (i + 1) % k == 0) {
suffixMax[i] = nums[i];
} else {
suffixMax[i] = Math.max(suffixMax[i + 1], nums[i]);
}
}
int[] ans = new int[n - k + 1];
for (int i = 0; i <= n - k; ++i) {
ans[i] = Math.max(suffixMax[i], prefixMax[i + k - 1]);
}
return ans;
}
}