記事のディレクトリ
タイトル説明
アレイNUMS与えられ、アレイへの左端の列からウィンドウ移動する摺動右端kの大きさを有しています。あなただけのスライディングウィンドウ内のk個の数字を見ることができます。右のいずれかにウィンドウの移動をスライドする時間。
スライディングウィンドウ内の最大値を返します。
例:
入力:NUMS = [1,3、-1、 -3,5,3,6,7]、 及びk = 3
出力:[3,3,5,5,6,7]
説明:スライディングウィンドウの最大の位置
--------------- -----
[-1。3. 1] -3-。5. 6. 3最大7 :. 3
。1 [3 -3 -1]。5最大6. 7. 3 :. 3。
1. 3 [-3 -1 5。] 3、最大6 7 :. 5。。。
1. 3 -1 [-3 3. 5。]最大6 7 :. 5。
1. 3 -1 -3最大7。[3 5 6]: 6
。1 5 3 -3 -1 [3 6 7]最大:. 7
問題の解決策
主な問題は、古典的なタイトルデックと動的計画法を研究するために使用されます。一時的に最初のソリューション両端キューIMPRESS。補足規制を行うために移動させた後(?)
暴力(Javaの)
アイデア:次のように。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums.length == 0 || k == 0) return new int[0];
int[] ans = new int[nums.length - k + 1];
int[] tmp = new int[k];
for ( int i = 0; i < nums.length - k + 1; i++) {
// 更新tmp
int index = 0;
for ( int j = i; j < i + k; j ++) {
tmp[index++] = nums[j];
}
// 找tmp里的最大值
Arrays.sort(tmp);
// 将最大值保存在ans里
ans[i] = tmp[k-1];
}
return ans;
}
}
複雑性分析
- 時間の複雑さ:O( )
- 宇宙複雑:O(n)は、
両端キュー(Javaの)
思想:両側両端キューのデータ構造、すなわち直接操作することができます。両端キュー最も一般的な場所は、動的なウィンドウ長、または連続を達成することである、とダイナミックウィンドウがで多くの問題に使用されるようなデータ構造を有しています。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || nums.length < 2) return nums;
// 双向队列 保存当前窗口最大值的数组位置 保证队列中数组位置的数值按从大到小排序
LinkedList<Integer> queue = new LinkedList();
// 结果数组
int[] result = new int[nums.length-k+1];
// 遍历nums数组
for(int i = 0;i < nums.length;i++){
// 保证从大到小 如果前面数小则需要依次弹出,直至满足要求
while(!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]){
queue.pollLast();
}
// 添加当前值对应的数组下标
queue.addLast(i);
// 判断当前队列中队首的值是否有效
if(queue.peek() <= i-k){
queue.poll();
}
// 当窗口长度为k时 保存当前窗口中最大值
if(i+1 >= k){
result[i+1-k] = nums[queue.peek()];
}
}
return result;
}
}
- 時間の複雑さ:O(n)は、
- 宇宙複雑:O(n)は、