一、题目描述💯
二、思路分析🤔
- 如果数组的长度为 n ,窗口大小为 w ,则一共可以产生 n - w + 1个窗口最大值
- arr1看作一个队列,存放的是arr的下标,有头有尾,有出队和入队规则
- 出队规则:①当arr1队尾存的下标对应arr的值小于或等于当前arr[i]时,arr1队尾出队,然后再重新比较②当队头的下标过期时(arr1[0]<(i+1-w))
- 入队规则:①当arr1为空时②当arr1队尾存的下标对应arr的值大于当前arr[i]时,队尾添加arr[i]的下标i
三、代码实现🔠
function largestWindow(arr,w){
let arr1 = []
for (let i = 0; i < arr.length-w+1; i++) {
let max = arr[i]
for(j=1;j<w;j++){
max = max>arr[i+j]?max:arr[i+j]
}
arr1.push(max)
}
return arr1
}
function largestWindowa(arr,w){
let arr1 = []
let arr2=[]
for (let i = 0; i < arr.length; i++) {
if(arr1[0]<(i+1-w)){
arr1.shift()
}
while(true){
if(arr1.length==0){
arr1.unshift(i)
break
}
let j =arr1[arr1.length-1]
if(i==0)break
if(arr[j]>arr[i]){
arr1.push(i)
break
}else {
arr1.pop();
}
}
if(i>=w-1){
arr2.push(arr[arr1[0]])
}
}
return arr2
}
感谢🙇
点赞支持👍