生成窗口最大值数组
題目:
有一個整型數組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+1個窗口。?
?
請實現一個函數。
1、輸入:整型數組arr,窗口大小w?
2、輸出:一個長度大小為n-w+1的數組res,res[i]表示每一種窗口下的最大值。例如上面的例子,應該返回[5,5,5,4,6,7]。
基本思路:
使用雙端隊列,遍歷一遍數組,假設遍歷到的位置是 i,如果隊列為空或者隊尾所對應的元素大于arr[i],將位置 i 壓入隊列;否則將隊尾元素彈出,再將 i 壓入隊列。此時,判斷隊頭元素是否等于i - w,如果是的話說明此時隊頭已經不在當前窗口的范圍內,刪去。這樣,這個隊列就成了一個維護窗口為w的子數組的最大值更新的結構,隊頭元素就是每個窗口的最大值。
?
時間復雜度為O(N),空間復雜度為O(N)
def getMaxWindow(L,w):if L == None or len(L) < 1 or len(L) < w:returnqueue = []res = []while len(queue)!=0 and L[queue[-1]] < L[i]:queue.pop()queue.append(i)if queue[0] == i - w:queue.pop(0)if i > w - 1:res.append(L[queue[0]])return res?
總結
- 上一篇: 自然数数组的排序
- 下一篇: 最大值减去最小值小于或等于num的子数组