雙指標演算法以及一些典型例題

2021-10-07 11:14:32 字數 2223 閱讀 5848

一、雙指標演算法兩種常見的問題分類:

(1)對於兩個序列,維護某種次序,比如歸併中合併兩個有序序列的操作

(2)對於乙個序列,用兩個指標維護一段區間

注意,這裡雖然說雙指標,但不代表是真正的兩個指標,你可以理解為兩個變數i,j

但是這兩個變數i,j它們是一直向前行進的,是不會後退,就拿kmp來說,其實它也用到雙指標的思想以及歸併排序當中的合併兩個區間的**。

尺取法,這個說到底就是雙指標思想衍生出來的,那什麼是尺取法呢?你就理解為一把可長可短的尺子,推進你要遍歷的元素

尺取法:顧名思義,像尺子一樣取一段,通常是對陣列儲存一對下標,即所選取的區間的左右端點,然後根據實際情況不斷地推進區間左右端點以得出答案。之所以需要掌握這個技巧,是因為尺取法比直接暴力列舉區間效率高很多,尤其是資料量大的時候,所以尺取法是一種高效的列舉區間的方法,一般用於求取有一定限制的區間個數或最短的區間等等。

在對所選取區間進行判斷之後,我們可以明確如何進一步有方向地推進區間端點以求解滿足條件的區間。

明確題目所需要求解的量之後,區間左右端點一般從最整個陣列的起點開始,之後判斷區間是否符合條件在根據實際情況變化區間的端點求解答案。

二、核心模板 :樸素演算法:

for(int i=0;i雙指標演算法:

先寫乙個樸素的演算法,尋找 i,j 有沒有單調的關係,利用這些單調的關係,將上面的樸素演算法演算法優化到o(n)

for(i=0,j=0;i例題展示:

例題一:

給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續子串

#include

using namespace std;

const

int n=

100010

;int n;

int a[n]

,s[n]

;int

main()

res=

max(res,i-j+1)

;}cout

}

例題二(經典題):

給定長度n的整數列a0,…,an-1以及s。求總和不小於s的連續子串行長度最小值。

#include

#include

using namespace std;

typedef

long

long ll;

const

int maxn=

1e5+10;

ll a[maxn]

;ll n;

ll s;

intmain()

if(ans>n) ans=0;

cout<}return0;

}

例題三:

一本書p頁,第i頁有知識點ai,同乙個知識點可能多次提到,希望通過連續的一些頁把所有知識點都覆蓋到。求出連續的最少頁數。

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using namespace std;

typedef

long

long ll;

const

int mod=

1e9+7;

const

int maxn=

1e6+10;

int a[maxn]

;int n;

set <

int> s;

map <

int,

int> vis;

intmain()

int len=s.

size()

;int l=

0,r=

0,cnt=0;

int ans=n;

while(1

)if(cntbreak

; ans=

min(ans,r-l)

; vis[a[l]]--

;if(vis[a[l++]]

==0) cnt--;}

printf

("%d\n"

,ans)

;return0;

}

一篇例題部落格

分治演算法以及典型例題

1 可以將大問題分解,分解後的問題容易解決 2 分解後的子問題是同一種類,並且具有最優子結構性質 下面會解釋 3 分解後的子問題解決後可以合併 4 分解後的子問題沒有公共問題 dp可以解決 ps 最優子結構 區域性最優解是全域性最優解的一部分,即當前的狀態是最優的,與後面的決策沒關係 同動態規劃與貪...

C 一些經典例題

include using namespace std int main cout邏輯運算子 要判別某一年 year 是否為閏年。閏年的條件是符合下面兩者之一 能被4整除,但不能被100整除。能被100整除,又能被400整除。用乙個邏輯表示式來表示 year 4 0 year 100 0 year ...

C 指標的用法以及一些其他內容

include include include include using namespace std intmain double ptr score score double ptr score score 0 cout 指向陣列的指標 ptr score 2 t score t score 1...