尺取法也叫(追逐法 、 two pointer) ,顧名思義,像尺子一樣,一塊一塊的擷取。尺取法比直接暴力列舉區間效率高很多,尤其是資料量大的時候,所以說尺取法是一種高效的列舉區間的方法,是一種技巧。用尺取法來優化,可以使複雜度降為o(n)。是不是解釋的有點讓人納悶~。。沒關係,下面我們通過這個題目來體會尺取法的魅力。
題目內容:
給定長度為n的數列整數a0,a1,a2,a3 … an-1以及整數s。求出綜合不小於s的連續子串行的長度的最小值。如果解不存在,則輸出0。
這裡我們拿第一組測試資料舉例子,即 n=10, s = 15, a =
尺取法的整個過程分為4部:
1.初始化左右端點
2.不斷擴大右端點,直到滿足條件
3.如果第二步中無法滿足條件,則終止,否則更新結果
4.將左端點擴大1,然後回到第二步
過程分析:
首先,序列都是正數,如果乙個區間其和大於等於s了,那麼不需要在向後推進右端點了,因為其和也肯定大於等於s但長度更長,所以,當區間和小於s時右端點向右移動,和大於等於s時,左端點向右移動以進一步找到最短的區間,如果右端點移動到區間末尾其和還不大於等於s,結束區間的列舉。
最後,再給乙個尺取法的定義以便更好理解:返回的推進區間開頭和結尾,求滿足條件的最小區間的方法稱為尺取法。
#include
using
namespace std;
#define n 10
#define s 15
intsolve
(int a)
if(sum < s)
res=
min(res,
(r-l));
sum-
=a[l]
; l++;}
}int
main()
;int res=
solve
(a);
printf
("%d\n"
,res)
;}
參考部落格: 演算法 尺取法
我們先來介紹一下尺取法。尺取法,顧名思義,像尺子一樣,一塊一塊的擷取。題目翻譯 給定長度為n的數列整數a0,a1,a2,a3 an 1以及整數s。求出綜合不小於s的連續子串行的長度的最小值。如果解不存在,則輸出0。限制條件 100s 10 8 這裡我們拿第一組測試資料舉例子,即 n 10,s 15,...
尺取法練習
mr wolfram 的csdn 部落格 hopeforbetter的csdn部落格,尺取法顧名思義就像尺子一樣,當測量乙個物體時,你不一定從開始的位置測量,你可以從任意乙個位置st開始,當然前提是尺子夠長,然後你再讀出尾部en的數,尾部減去開始的位置en st,就是這個物體的長度。尺取法就是這個思...
尺取法基礎
p1638 逛畫展 題意 求最短區間包含所有畫家。思路 利用兩個變數來維護區間,如果區間不滿足條件r 滿足的話,l 直到區間最小。includeusing namespace std int a 1000005 b 1000005 int main b a l if b a l 0 k l else...