雙指標演算法(持續更新)

2021-09-23 18:13:02 字數 2235 閱讀 7302

演算法思想: 利用問題本身與序列的特性(序列遞增性質),使用兩個下標i、j對序列進行掃瞄(可以同向掃瞄,也可以反向掃瞄),以較低的複雜度解決問題。

tips:要注意雙指標的方向選擇!!!

eg1. 給定乙個遞增的正整數序列和乙個正整數m,求序列中不同位置的數a和b,是的它們的和恰好為m,輸出所有滿足條件的方案。

// 兩個指標反向掃瞄

while

(i < j)

else

if(a[i]

+a[j]

< m)

else

}

eg2. 序列合併問題

// 兩個指標同向掃瞄

intmerge

(int a,

int b,

int c,

int n,

int m)

else

}while

(i < n)

while

(j < m)

return index;

// 返回序列c的長度

}

eg3. pat b1030 完美數列

思路分析:

本題可以用二分法,也可以使用雙指標演算法

雙指標演算法:當m1較小時,與其對應的m1也相對較小;當m2較大時,與其對應的m2也相對較大。即m1**(ac):

#include

#include

#include

using

namespace std;

const

int maxn =

100010

;int a[maxn]

;int

main()

sort

(a, a+n)

;int i =

0, j =0;

// 利用同向雙指標

思路分析:

仿照陣列合併的思路,但此處不需要真的將合併陣列存下來,只需要利用i、j兩個指標的移動,移到中值所在位置即可。

**(未ac):

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1000010

;const

int inf =

0x7fffffff

;// 最大值

int s1[maxn]

, s2[maxn]

;int

main()

s1[n]

= inf;

// 設定最大值,就不需要判斷某一數值是否已經取完

scanf

("%d"

,&m)

;for

(int i=

0; i

) s2[m]

= inf;

// 設定最大值,就不需要判斷某一數值是否已經取完

int pos =

(n+m-1)

/2;// 中位數下標

int index =0;

int i =

0, j =0;

while

(index < pos)

else

}int ans =

min(s1[i]

, s2[j]);

printf

("%d"

, ans)

;fclose

(stdin);

return0;

}

指標學習筆記(持續更新)

question 1.什麼是指標?2.指標與引用的異同?何時使用指標,何時使用引用?1.c 提供兩種字串 string類物件和c風格的基於指標的char 字串。2.常量指標自身不可改變,而指向的目標可以改變。使用const修飾指標 指向非常量資料的非常量指標 如 int ptr 應用 間接引用指標使...

雙指標演算法

雙指標演算法模板 for int i 0,j 0 i n i 常見問題分類 1 對於乙個序列,用兩個指標維護一段區間 2 對於兩個序列,維護某種次序,比如歸併排序中合併兩個有序序列的操作 例題1 最長連續不重複子序列 給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。輸...

雙指標演算法

title 雙指標演算法 date 2019 05 26 23 45 09 tags 雙指標演算法 雙指標演算法 主要是兩大類 核心思想 將乙個 o n 2 o n 2 o n2 的演算法 優化成 o n o n o n 的for int i 0 i for int j 0 j for i 0,j ...