Skip to content

Commit 86ad19e

Browse files
committed
fd
1 parent 174fa1c commit 86ad19e

File tree

4 files changed

+39
-64
lines changed

4 files changed

+39
-64
lines changed

solution/src/main/java/com/inuker/solution/SlidingWindowMaximum.java

Lines changed: 18 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,62 +22,42 @@ public class SlidingWindowMaximum {
2222
* 注意PriorityQueue的remove复杂度是O(k),所以本题复杂度是O(n*k)
2323
* 可以将PriorityQueue转成TreeMap,复杂度为O(n*lgk)
2424
*/
25-
// 耗时58ms
2625
public int[] maxSlidingWindow(int[] nums, int k) {
27-
if (nums.length == 0) {
26+
if (nums.length == 0 || k == 0) {
2827
return new int[0];
2928
}
30-
31-
Queue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {
32-
@Override
33-
public int compare(Integer i1, Integer i2) {
34-
return i2 - i1;
35-
}
36-
});
37-
38-
for (int i = 0; i < k; i++) {
39-
queue.offer(nums[i]);
40-
}
41-
4229
int[] result = new int[nums.length - k + 1];
43-
result[0] = queue.peek();
44-
45-
for (int i = 1; i < result.length; i++) {
46-
queue.remove(nums[i - 1]);
47-
queue.offer(nums[i + k - 1]);
48-
result[i] = queue.peek();
30+
Queue<Integer> queue = new PriorityQueue<>(Comparator.<Integer>reverseOrder());
31+
for (int i = 0; i < nums.length; i++) {
32+
queue.offer(nums[i]);
33+
if (queue.size() > k) {
34+
queue.remove(nums[i - k]);
35+
}
36+
if (i - k + 1 >= 0) {
37+
result[i - k + 1] = queue.peek();
38+
}
4939
}
50-
5140
return result;
5241
}
5342

54-
// 耗时23ms
55-
// queue中存的是索引
5643
public int[] maxSlidingWindow2(int[] nums, int k) {
57-
if (nums.length == 0) {
44+
if (nums.length == 0 || k == 0) {
5845
return new int[0];
5946
}
60-
61-
Deque<Integer> queue = new LinkedList<Integer>();
62-
6347
int[] result = new int[nums.length - k + 1];
64-
48+
Deque<Integer> queue = new LinkedList<>();
6549
for (int i = 0; i < nums.length; i++) {
66-
if (!queue.isEmpty() && queue.peek() <= i - k) {
67-
queue.removeFirst();
68-
}
69-
70-
while (!queue.isEmpty() && nums[queue.peekLast()] < nums[i]) {
50+
while (!queue.isEmpty() && nums[i] > nums[queue.peekLast()]) {
7151
queue.pollLast();
7252
}
73-
7453
queue.offerLast(i);
75-
76-
if (i >= k - 1) {
77-
result[i - k + 1] = nums[queue.peek()];
54+
if (queue.peekFirst() + k <= i) {
55+
queue.pollFirst();
56+
}
57+
if (i - k + 1 >= 0) {
58+
result[i - k + 1] = nums[queue.peekFirst()];
7859
}
7960
}
80-
8161
return result;
8262
}
8363
}

test/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ dependencies {
66
compile project(':solution')
77
}
88

9-
sourceCompatibility = "1.7"
10-
targetCompatibility = "1.7"
9+
sourceCompatibility = "1.8"
10+
targetCompatibility = "1.8"

test/src/main/java/com/inuker/test/main.java

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,39 +13,34 @@
1313
import java.util.LinkedHashMap;
1414
import java.util.LinkedList;
1515
import java.util.List;
16+
import java.util.PriorityQueue;
17+
import java.util.Queue;
1618
import java.util.Set;
1719
import java.util.Stack;
1820

1921
public class main {
2022

2123
public static void main(String[] args) {
22-
List<String> list = summaryRanges(new int[] {
23-
0, 1, 2, 4, 5, 7
24-
});
25-
for (String s : list) {
26-
System.out.print(s + " ");
27-
}
2824
}
2925

30-
public static List<String> summaryRanges(int[] nums) {
31-
List<String> list = new LinkedList<>();
32-
if (nums == null || nums.length == 0) {
33-
return list;
26+
public int[] maxSlidingWindow(int[] nums, int k) {
27+
if (nums.length == 0 || k == 0) {
28+
return new int[0];
3429
}
35-
int start = nums[0], to = start;
36-
for (int i = 1; i < nums.length; i++) {
37-
if (nums[i] == to + 1) {
38-
to++;
39-
} else {
40-
list.add(getRange(start, to));
41-
start = to = nums[i];
30+
int[] result = new int[nums.length - k + 1];
31+
Deque<Integer> queue = new LinkedList<>();
32+
for (int i = 0; i < nums.length; i++) {
33+
while (!queue.isEmpty() && nums[i] > nums[queue.peekLast()]) {
34+
queue.pollLast();
35+
}
36+
queue.offerLast(i);
37+
if (queue.peekFirst() + k <= i) {
38+
queue.pollFirst();
39+
}
40+
if (i - k + 1 >= 0) {
41+
result[i - k + 1] = nums[queue.peekFirst()];
4242
}
4343
}
44-
list.add(getRange(start, to));
45-
return list;
46-
}
47-
48-
private static String getRange(int start, int to) {
49-
return to > start ? start + "->" + to : String.valueOf(to);
44+
return result;
5045
}
5146
}

test/test.iml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
</configuration>
1414
</facet>
1515
</component>
16-
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
16+
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
1717
<output url="file://$MODULE_DIR$/build/classes/java/main" />
1818
<output-test url="file://$MODULE_DIR$/build/classes/java/test" />
1919
<exclude-output />

0 commit comments

Comments
 (0)