棧與佇列6 生成最大視窗值陣列

2021-10-01 19:36:02 字數 944 閱讀 7557

乙個整形陣列arr,乙個大小為w的視窗從陣列左邊向右邊滑動,一次滑動步長為1

舉例,陣列[4,3,5,4,3,3,6,7],視窗大小為3時:

如果陣列長度為n,視窗大小為w,則一共會產生n-w+1個視窗最大值

輸入:整形陣列arr,視窗大小為w

輸出:乙個長度為n-w+1的陣列res,res[i]表示每乙個視窗下的最大值

最直接的想法,對整形陣列arr每個值進行遍歷,同時對視窗w大小內的值進行遍歷,雙重for迴圈實現,時間複雜度為o(n*w),本思路目標實現o(n)的時間複雜度。

資料結構:雙端佇列deque命名為qmax,qmax用來存放整形陣列arr中的下標。

遍歷整形陣列:

假設遍歷到arr[i],qmax放入規則為:

如果qmax為空,直接將下標i放入qmax,結束

若不為空,取出當前qmax隊尾存放的下標,假設為j。

假設遍歷到arr[i],qmax的彈出規則:

如果qmax的隊頭的下標等於i-w,說明當前qmax隊頭的下標已過期,彈出即可,舉例,隊頭下標為0,視窗大小w=3,當前i=3,當前的陣列元素遍歷到了arr[3],比較的範圍最遠為,arr[1],arr[2],arr[3],所以arr[0]已經過期。

為何時間複雜度為o(n),因為遍歷過程中,每個元素最多進一次qmax,出qmax一次,所以進出雙端佇列qmax的時間複雜度為o(n)即整體時間複雜度為o(n)。

public int getmaxwindow(int arr,int w)

} return res;

}

所以**的整體邏輯就是,先放入qmax,然後判斷qmax隊頭是否過期,如果沒有則將qmax對應的整形陣列值加入res,

1 7生成視窗最大值陣列

1.題目 有乙個整形陣列arr和乙個大小為w的視窗從陣列的最左邊滑倒最右面,視窗每次向右邊滑動乙個位置。例如 4,3,5,4,3,3,6,7 視窗大小為3時,則產生的視窗最大值為 5,5,5,4,6,7 2.思路 每次看到一大堆的文字解釋我都不想看,為什麼不能有乙個圖示呢?要跪了 簡單的說利用雙端佇...

演算法3 生成視窗最大值陣列

question 有乙個整形陣列arr 和乙個大小為w 的視窗從陣列的最左邊滑到最右邊,視窗每次向右滑動乙個位置 如果陣列長度是n,視窗大小是w,則一共產生n w 1 個視窗,請實現乙個函式,輸入 整形arr陣列,視窗大小w 輸出 乙個長度為n w 1 的陣列res,res i 標識每種視窗狀態下掉...

棧和佇列 生成視窗最大值陣列

題目 有乙個整型陣列arr和乙個大小為w的視窗從陣列的最左邊滑到最右邊,視窗每次向右滑動乙個位置。例如,陣列為 4,3,5,4,3,3,6,7 視窗大小為3時 依次出現的視窗為 4,3,5 3,5,4 5,4,3 4,3,3 3,3,6 3,6,7 如果陣列長度是n,視窗大小是w,則一共產生n w ...