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
| class Solution {
/**
[2,6,4,8,10,9,15]
[2,6,4,13,10,12,15]
[2,4,5,6,3] - increasing stack
(2,4,5,6,3!)
(2!)
(15,12,10,13!) decreasing stack
(15,13)
*/
public int findUnsortedSubarray(int[] nums) {
Stack<Integer> incStack = new Stack<>();
int lo = nums.length;
for (int i = 0; i < nums.length; i++) {
while (incStack.size() > 0 && nums[i] < nums[incStack.peek()]) {
lo = Math.min(lo, incStack.pop());
}
incStack.push(i);
}
Stack<Integer> decStack = new Stack<>();
int hi = 0;
for (int i = nums.length - 1; i >= 0; i--) {
while (decStack.size() > 0 && nums[i] > nums[decStack.peek()]) {
hi = Math.max(hi, decStack.pop());
}
decStack.push(i);
}
return hi - lo > 0 ? hi - lo + 1: 0;
}
}
|