尺取法列舉區間

2021-10-06 06:17:06 字數 1027 閱讀 9904

尺取法也叫(追逐法 、 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...