給定乙個陣列和滑動視窗的大小,請找出所有滑動視窗裡的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,它們的最大值分別為
1、乙個滑動視窗可以看成乙個佇列。當視窗滑動時,處於視窗的第乙個數字被刪除,同時在視窗的末尾新增乙個新的數字。這符合佇列「先進先出」特性。
2、題意:
陣列中的滑動視窗
滑動視窗中的最大值
[2,3,4],2,6,2,5,1
42,[3,4,2],6,2,5,1
42,3,[4,2,6],2,5,1
62,3,4,[2,6,2],5,1
62,3,4,2,[6,2,5],1
62,3,4,2,6,[2,5,1]5
3、只把有可能成為滑動視窗最大值的數值存入乙個兩端開口的佇列。【以例題作為分析的例子】
4、陣列的第乙個數字是2,把它存入佇列。第二個數字是3,由於它比前乙個數字2大,因此2不可能成為滑動視窗中的最大值。先把2從隊裡中刪除,再把3存入佇列。此時佇列中只剩下乙個數字3.針對第三個數字4的步驟類似,最終在佇列中只剩下乙個數字4.此時滑動視窗已經有3個數字,而它的最大值4位於佇列的頭部。
5、接下來處理第4個數字2.2比佇列中的數字4小。當4滑出視窗之後,2還是有可能成為滑動視窗的最大值,因此把2存入佇列的尾部。現在佇列中有數字4和2,其中最大值4仍然位於佇列的頭部
6、第五個數字6.由於它比佇列中已有的兩個數字4和2都打美因茨這時4和2已經不可能成為滑動視窗的最大值了。先把4和2從佇列中刪除,再把數字6存入佇列。這時最大值6仍然位於佇列的頭部
7、第六個數字是2.由於它比佇列中已有的數字6小,所以把2也存入佇列的尾部,此時佇列中有兩個數字,其中最大值6仍然位於佇列的頭部
8、第七個數字5.在佇列中已有兩個數字6和2裡,2小於5,因此2不可能是乙個滑動視窗的最大值,可以把它從佇列的尾部刪除。刪除數字2之後,再把5存入佇列。此時佇列裡剩下兩個數字6和5,其中位於佇列頭部的是最大值6
9、陣列最後乙個數字是1,把1存入佇列的尾部。注意到位於佇列頭部的數字6是陣列的第5個數字,此時的滑動視窗已經不再包括這個數字了,因此應該把數字6從佇列中伸出,那麼怎麼知道滑動視窗是否包括乙個數字?應該在佇列裡存入數字在陣列裡的下標,而不是數值。當乙個數字的下標與當前處理的數字的下標只差大於或等於滑動視窗的大小時,這個數字已經從滑動視窗中滑出,可以從佇列中刪除了
10、步驟
插入數字
滑動視窗
佇列的下標
最大值122
0(2)
n/a2
32,3
1(3)
n/a3
42,3,4
2(4)44
23,4,2
2(4),3(2)45
64,2,6
4(6)66
22,6,2
4(6),5(2)67
56,2,5
4(6),6(5)68
12,5,1
6(5),7(1)
5
std::vector
maxinwindows(const
vector
& num,unsigned
int size)
//從第三個數開始
for(unsigned
int i=size;iwhile(!index.empty() && num[i]>=num[index.back()])
index.pop_back();
//在視窗之外的,不可能是
if(!index.empty() && index.front() <=(int)(i-size))
index.pop_front();
index.push_back(i);
}maxinwindows.push_back(num[index.front]);
}return maxinwindows;
}
請定義乙個佇列並實現函式max得到佇列的最大值。要求函式max、push_back和pop_front的時間複雜度都是o(1)
template
class queuewinthmax
void push_back(t number)
;data.push_back(internaldata);
maximums.push_back(internaldata);
++currentindex;
}void pop_front()
t max() constexpr
private:
struct internaldata
;deque
data;
deque
maximums;
int currentindex;
}
二十四 資料結構之斜堆
和左式堆性質差不過,只不過去掉了npl的限制,每對右子樹進行一次操作將交換一下該結點的兩兒子。include include 定義資料型別 typedef int elemtype typedef struct heapnode priorityqueue priorityqueue merge p...
二十四點演算法
給出四個數,不可以重複使用,可以用 和括號,怎麼得出24?return 1 表示當前方法不行 private int workbystep int op,int num1,int num2 else if op 1 else if op 2 else if op 3 只要沒有有小數生成,即使有負數也...
演算法二十四 矩形
給定兩個矩陣,判斷第二個矩陣在第乙個矩陣的哪些位置出現過。輸入的第一行包含四個正整數a,b,c,d,表示第乙個矩陣大小為a b,第二個矩陣的大小為c d。接下來是乙個a b的矩陣。再接下來是乙個c d的矩陣。保證矩陣中每個數字都為正整數且不超過100。若第二個矩陣在第乙個矩陣的 i,j 位置出現 即...