1. 題目:有乙個整形陣列arr和乙個大小為w的視窗從陣列的最左邊滑倒最右面,視窗每次向右邊滑動乙個位置。例如:[4,3,5,4,3,3,6,7],視窗大小為3時,則產生的視窗最大值為:[5,5,5,4,6,7].
2. 思路:(每次看到一大堆的文字解釋我都不想看,為什麼不能有乙個圖示呢?要跪了)。簡單的說利用雙端佇列實現視窗最大值得更新!
根據左程雲大神的思路是這樣子滴!如圖所示,利用雙端佇列快取視窗的最大值對應的陣列下標,佇列頭始終為當前視窗的最大值對應的下標。從頭開始遍歷arr[i]值,最大值佇列 qmax的放入規則為:當qmax為空時,把i放入到qmax中, i++;i=1時, arr[1]=arr[qmax.front()), 彈出1,繼續比較,直到佇列qmax為空或arr[qmax.front()]>arr[2], 然後插入2;繼續遍歷arr,直到結束。注意:在第5->6步驟時,當前最大值的下標為2,但是在第六步時,下標為2的元素已經不在當前視窗中,此時需要將佇列頭2彈出。 為了簡化實現過程,我首先將前視窗大小的元素進行處理,然後再對剩餘元素進行處理
3. answer:
#include#include #include using namespace std;
vectormaxinwindows(vector&num, unsigned int size)
index.push_back(i);
} for (int i = size; i < num.size();i++)
if (!index.empty()&&(index.front()+size-1)num= ;
int size = 3;
vectormaxs = maxinwindows(num, size);
for (int i = 0; i < maxs.size();i++)
cout << endl;
system("pause");
return 1;
}
演算法3 生成視窗最大值陣列
question 有乙個整形陣列arr 和乙個大小為w 的視窗從陣列的最左邊滑到最右邊,視窗每次向右滑動乙個位置 如果陣列長度是n,視窗大小是w,則一共產生n w 1 個視窗,請實現乙個函式,輸入 整形arr陣列,視窗大小w 輸出 乙個長度為n w 1 的陣列res,res i 標識每種視窗狀態下掉...
生成視窗最大值陣列
題目描述 有乙個整型陣列arr和乙個大小為w的視窗從陣列的最左邊滑到最右邊,視窗每次向右邊滑乙個位置,求每一種視窗狀態下的最大值。如果陣列長度為n,視窗大小為w,則一共產生n w 1個視窗的最大值 輸入描述 第一行輸入n和w,分別代表陣列長度和視窗大小 第二行輸入n個整數x,表示陣列中的各個元素 輸...
生成視窗最大值陣列
有乙個整型陣列arr和乙個大小為w的視窗從陣列的最左邊滑到最右邊,視窗每次向右邊滑乙個位置,求每一種視窗狀態下的最大值。如果陣列長度為n,視窗大小為w,則一共產生n w 1個視窗的最大值 輸入描述 第一行輸入 n 和 w 分別代表陣列長度和視窗大小 第二行輸入 n 個整數 x ix i xi 表示陣...