顧名思義,像尺子同樣取一段,尺取法一般是對數組保存一對下標,即所選取的區間的左右端點,而後根據實際狀況不斷地推動區間左右端點以得出答案。之因此須要掌握這個技巧,是由於尺取法比直接暴力枚舉區間效率高不少,尤爲是數據量大的時候,因此尺取法是一種高效的枚舉區間的方法,通常用於求取有必定限制的區間個數或最短的區間等等。固然任何技巧都存在其不足的地方,有些狀況下尺取法不可行,沒法得出正確答案。
也能夠說是,在給的一組數據中找到不大於某一個上限的「最優連續子序列」。
尺取法查找大於10的思路以下圖,黃色區域是每次查找的區間,第一次先找出左右端點後,固定右端點移動左端點,依次移動左端點直到沒法知足的狀況下更新右端點。每次比較序列長度獲得最優解。c++
例題:數組
代碼:spa
#include <bits/stdc++.h>
using namespace std; #define ll long long ll p[500005]; int main() { ll s, n; cin >> s >> n; ll sum = 0; for (int i = 0; i < n; i++) cin >> p[i], sum += p[i]; if (sum < s) printf("0\n"); else { sum = 0; int l = 0, r = 0; int ans = n; while (1) { while (r < n && sum < s) //每次將右端點r推到首次知足題意的位置
sum += p[r++]; if (sum < s) //若是已經沒有知足題意的右端點(即右端點推到盡頭)
break; ans = min(ans, r - l); //過程當中不斷更新答案
sum -= p[l++]; //左端點向右推進一個單位
} cout << ans << endl; } return 0; }