この質問を考えるのは非常に難しいです。
1つの方法は、2つのスタックで構成されるキューを実装することであり、このキューは最大値までポップアップする可能性がありますが、そのような実装は面接プロセス中に時間がかかりすぎるため、練習中に試すことができます。したがって、ここの方が優れています。書き方。
まず、2つのインデックスをウィンドウ添え字レコードとして設定し、ウィンドウに追加される現在よりも小さいデータがキューから削除されるたびに、これよりも大きいデータが検出されると、データはキューの最後に追加されます。各トラバーサルでは、ウィンドウのサイズを確認する必要があります。つまり、ウィンドウの外側のデータを削除する必要があります。
dequeの使用を忘れないでください
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 0){
return nums;
}
Deque<Integer> deque = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
for(int count_l = 0,count_p = 1-k;count_l<nums.length;count_l++,count_p++){
if(count_p>0 && nums[count_p-1]==deque.peekLast()){
deque.removeLast();
}
while(!deque.isEmpty()&&deque.peekFirst()<nums[count_l]){
deque.removeFirst();
}
deque.addFirst(nums[count_l]);
if(count_p>=0){
res[count_p] = deque.peekLast();
}
}
return res;
}