two pointer 雙指標法 初步介紹

2021-08-17 09:30:14 字數 961 閱讀 8843

例題1:給出n個數,找出和最接近k的兩個數。

思路 :

對陣列進行排序,乙個指標指向1(最小),另乙個指向n(最大)。如果兩指標之和大於k,則右指標左移1;如果兩指標之和小於k,則左指標右移1。

其中左移意為使值變大,右移意為使值變小,兩兩交換移動,就能最大可能的接近k。

例題2:給出n個數,找出和最接近k的三個數。

思路 :

列舉1個數,其餘與例題1一致。注意對於nums[st],nums[ed]和nums[i],都要判斷是不是與前乙個數相等。

例題3:給出n個數,問最多能組成多少個三角形。

思路 :

列舉b(第2邊),乙個指標指向a,另乙個指向c,如果滿足a+b>c就是乙個三角形,同時得知 b後面的數+c>a一定成立,然後end--。如果b+c

例題4:給你乙個長度為n的序列,對於所有長度》=k的選出其中的第k小元素,於是得到乙個新的集合,求出這個集合中的第l大元素,資料範圍n<=100000,所有數<=1e8。

思路 :

考慮二分答案,對於當前答案x,如果至少包含k個小於等於x的區間的數量

對於當前答案x, 我們對於原數列的每個數如果》x 那麼賦值為0,否則為1。於是我們只需要計算和大於等於k的區間數就可以了,這個顯然是可以用two-pointer在o(n)時間內完成的。

**:

#include #define maxn 2000007

using namespace std;

int n,k;

long long l;

int a[maxn],b[maxn];

long long tryit(int x)//計算和大於等於k的區間數

if (tryit(rx)>=1ll*(n-k+1)*(n-k+2)/2-l) printf("%d\n",rx); else printf("%d\n",lx);

return 0;

}

雙指標法LeetCode總結

遍歷物件的過程中,使用兩個指標進行操作,實現相應的目的 經典環形鍊錶 leetcode142 待補充適用於有序陣列,設定陣列左索引與陣列右索引 基本流程是 publicf int nums leetcode11 盛水最多的容器 class solution return max leetcode15...

演算法思維 雙指標法

雙指標可分為三類 其中,滑動視窗 已單獨寫了一篇隨筆,可跳轉檢視。在快慢指標中,又有一類典型演算法,叫 floyd s cycle finding algorithm,其又名floyd s hare and tortoise algorithm。在這裡,我們主要談論左右指標和快慢指標。左右指標 主要...

雙指標法的常見應用

標籤 演算法 pivot null面試 2012 08 10 10 09 3247人閱讀收藏 舉報 資料結構 演算法 20 所謂雙指標,指的是在遍歷物件的過程中,不是普通的使用單個指標進行訪問,而是使用兩個相同方向或者相反方向的指標進行掃瞄,從而達到相應的目的。換言之,雙指標法充分使用了陣列有序這一...