題目描述
給定一個數組和滑動窗口的大小,找出所有滑動窗口裏數值的最大值。
例如,如果輸入數組{2,3,4,2,6,2,5,1}及滑動窗口的大小3,那麼一共存在6個滑動窗口,他們的最大值分別爲{4,4,6,6,6,5}; 針對數組{2,3,4,2,6,2,5,1}的滑動窗口有以下6個:
{[2,3,4],2,6,2,5,1},
{2,[3,4,2],6,2,5,1},
{2,3,[4,2,6],2,5,1},
{2,3,4,[2,6,2],5,1},
{2,3,4,2,[6,2,5],1},
{2,3,4,2,6,[2,5,1]}。
解題思路
- 設置滑動窗口爲k,可以掃描每個滑動窗口的所有數字並找出其中的最大值。如果滑動窗口爲k,則需要O(k)時間才能找出滑動窗口的最大值。對於長度爲n的輸入數組,該方法的時間複雜度爲O(kn)。
算法圖解
寫法簡單不做圖了,書上的那種優化的寫法我一時沒看明白。?
參考代碼:
package offer;
/**
* 隊列的最大值
*/
public class Offer59 {
public static void main(String[] args) {
int nums[] = {2, 3, 4, 2, 6, 2, 5, 1};
findMaxInQueue(nums, 3);
}
/**
* 暴力 時間複雜度O(nk)
*
* @param nums
* @param K
*/
static void findMaxInQueue(int nums[], int K) {
if (nums == null) {
return;
}
if (nums.length < 2) {
System.out.println(nums[0]);
}
for (int i = 0; i < nums.length - 2; i++) {
int max = nums[i];
for (int j = 1; j < K; j++) {
if (max < nums[i + 1]) {
max = nums[i + 1];
}
i++;
}
i = i - 2;
System.out.println(max);
}
}
}
附錄
該題源碼在我的 ?Github 上面!