Java
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || k <= 0 ) return new int[0] ;
if( k == 1 ) return nums;
int n = nums.length ;
int[] r = new int[n - k + 1] ;
int index = 0 ;
Deque<Integer> q = new ArrayDeque<>();
for (int i = 0 ; i < nums.length ; i ++) {
while( !q.isEmpty() && q.peek() < i - k + 1) {
q.poll();
}
while( !q.isEmpty() && nums[q.peekLast()] < nums[i] ) {
q.pollLast();
}
// add
q.offer(i) ;
if( i >= k - 1 ){
r[index++] = nums[q.peek()];
}
}
return r ;
}
}
Golang
func maxSlidingWindow(nums []int, k int) []int {
// 排除出可以直接返回的數組
if len(nums) == 0 || k == 1 { return nums }
// 判斷數組長度
if( len(nums) < k ) {
sort.Ints(nums)
return nums[len(nums) - 1 : len(nums)]
}
// 設置遍量
var area []int
var temp []int
// 開始切片
for i := 0 ; i < len(nums) ; i ++ {
for len(temp) != 0 && temp[0] < i - k + 1 {
temp = temp[1:]
}
for len(temp) != 0 && nums[ temp[len(temp) - 1] ] < nums[i] {
temp = temp[:len(temp)-1]
}
temp = append(temp,i)
if i >= k - 1 {
area = append(area,nums[temp[0]])
}
}
return area
}