leetcode 239. sliding window maximum
可能沒有辦法註冊,就點這裡
給你乙個整數陣列nums
,有乙個大小為 \(k\) 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 \(k\) 個數字。滑動視窗每次只向右移動一位。
返回滑動視窗中的最大值。
這道題用暴力顯然是過不了的(時間複雜度\(o(nk)\))。這時候我們就需要……
了解單調佇列,需要知道什麼是單調。
這裡用函式的單調性的定義,與這裡的單調也大同小異。
函式的單調性(monotonicity)也可以叫做函式的增減性。當函式 f(x) 的自變數在其定義區間內增大(或減小)時,函式值f(x)也隨著增大(或減小),則稱該函式為在該區間上具有單調性。單調佇列也是一樣,可以看成佇列的乙個子集,滿足\(\forall i(1 \le i \lt size)\text queue[i] \le queue[i+1]\)或\(\forall i(1 \le i \lt size)\text queue[i] \ge queue[i+1]\)。
需要實現這些功能:
底層容器
由於單調佇列本來就是佇列的變種,stl佇列又基於deque
,所以我就私自選擇deque
了。
完整**(我還順便加了乙個back()
):
struct humdrumqueue
} void push(int val)
this->q.push_back(val);
} int front()
int back()
int size()
};
其中,pop
函式需要判隊首與本數相同。
push
則使用大了就出隊的思路。
請自己思考為什麼。
vectormaxslidingwindow(vectornums, int k)
answer.push_back(hq.front());
for (int i = k; i < int(nums.size()); i++)
return answer;
}
\(\textbf\)leetcode的提交方法有些不同
時間複雜度與空間複雜度為\(o(n)\),完美解決。
p1886 滑動視窗 /【模板】單調佇列
有乙個長為 \(n\) 的序列 \(a\),以及乙個大小為 \(k\) 的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。
例如:the array is \([1,3,-1,-3,5,3,6,7]\), and \(k = 3\)。
這道題跟原來的題差不多。
只是新增了乙個最小的。
uva11572 唯一的雪花 unique snowflakes
我用的是另乙個做法:
#include using namespace std;
int a[1000005];
int main()
} void push(int val)
this->q.push_back(val);
} void push2(int val)
this->q.push_back(val);
} int front()
int back()
int size()
};vectormaxslidingwindow(vectornums, int k)
answer.push_back(hq.front());
for (int i = k; i < int(nums.size()); i++)
return answer;
}vectorminslidingwindow(vectornums, int k)
answer.push_back(hq.front());
for (int i = k; i < int(nums.size()); i++)
return answer;
}
其中humdrumqueue.push
是大的,humdrumqueue.push2
是小的。 單調佇列 滑動視窗
nkoj 2152 description 給你乙個長度為n n 10 6 的陣列,乙個長為k的滑動的窗體從最左移至最右端,你只能見到視窗的k個數,每次窗體向右移動一位,找出窗體所包含的數字的最大和最小值,如下表所示 k的值為3 視窗位置 最小值 最大值 1 3 1 3 5 3 6 7 1 3 1 ...
滑動視窗 單調佇列
給定乙個大小為n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值 最大值 1 3 1 3 5 3 6 7 1 3 1 3 1 3 5 3...
單調佇列 滑動視窗
p1886 滑動視窗 模板 單調佇列 有乙個長為 n 的序列 a,以及乙個大小為 k 的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。如果按照暴力方法做的話,每一次判斷相鄰的k個數的最大值和最小值,複雜度為o n k 肯定會超時,因此就想到把每次的最大值和...