演算法思想: 利用問題本身與序列的特性(序列遞增性質),使用兩個下標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 ...