首先對於雙指標演算法,必須明確,對於此問題來說,只能是乙個優化問題,核心思想是把乙個o(n2)的時間複雜度問題給優化到o(n)來解決。
通用模板:
按照樸素演算法:
for(
int i=
0;i)for
(int j=
0;j)按照某種性質進行優化:
for(
int i-
0,j=
0;i)while
(jcheck
(i,j)
(某種屬性))
雙指標通常與滑窗來共同使用,先來介紹什麼是滑窗:
滑窗通常來說就是left與right來構成乙個視窗對於left我們通常用做收縮視窗,對於right通常使用擴充套件視窗。然後滿足擴充套件條件就可以向右擴充套件,然後要是視窗發生溢位(條件達到)則可以使左指標向右移動。
具體題目舉例:
給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。
輸入格式
第一行包含整數n。
第二行包含n個整數(均在0~100000範圍內),表示整數序列。
輸出格式
共一行,包含乙個整數,表示最長的不包含重複數字的連續子串行的長度。
分析:常常利用單調性來解決此類問題:
首先設乙個i,j,其中i是正常從前向後列舉,然後對於j來說應該是i,j之間的最大距離(不重複)所以可以得到,對於每次i往後移動,看看j是否移動,然後再更新答案。
**:
#include
#include
using
namespace std;
const
int max1=
100010
;int a[max1]
;int s[max1]
;int
main()
res=
max(res,i-j+1)
;```
演算法基礎課筆記
方法步驟 1 確定分界點。一般取q l q r q l r 2 作為樞紐。2 調整區間,左邊的都是小於等於樞紐值,右邊的都是大於等於樞紐值。最重要 3 遞迴處理左右兩段。快速排序模板 void quick sort int q int l int r quick sort q,l,j quick s...
演算法基礎課 高精度
j高精度演算法 常用的有加減,對於乘除我們只會用小數乘大數。首先對於高精度加法,應該使用string類來進行表示,然後對於此類問題還需要特別注意的就是對於乙個大數來說,我們應該進行倒置,這樣對於加減來說更為有利。對於高精度加法模板如下 應該先設定乙個t 0 然後分別加上每乙個數的對應位即可解決問題。...
基礎演算法 雙指標演算法
1.核心思想 通過某種線性關係將原先o n2 的樸素演算法優化為o n 的快速演算法 2.一般應用思路 1 先寫乙個暴力的樸素o n2 的演算法 2 找到兩個指標之間的單調關係 3 如果有單調關係,可以將列舉從o n2 優化到o n 3.模板 for int i 0,j 0 i n i 常見問題的分...