ソードフィンガーオファーインタビュー質問59:キューの最大値(両端キュー、スライディングウィンドウ)

この質問を考えるのは非常に難しいです。

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;
    }

 

 

 

おすすめ

転載: blog.csdn.net/qq_40473204/article/details/115190072