C語言雙指針?biāo)惴ㄅ笥堰^情人節(jié)我過算法
雙指針
首先咱得知道何為雙指針,聽起來很上流,其實(shí)有手就行。
雙指針,指的是在遍歷對(duì)象的過程中,不是普通的使用單個(gè)指針進(jìn)行訪問,而是使用兩個(gè)相同方向(快慢指針)或者相反方向(對(duì)撞指針)的指針進(jìn)行掃描,從而達(dá)到相應(yīng)的目的。
換言之,雙指針法充分使用了數(shù)組有序這一特征,當(dāng)遇到有序數(shù)組時(shí),應(yīng)該優(yōu)先想到雙指針來解決問題,因兩個(gè)指針的同時(shí)遍歷會(huì)減少空間復(fù)雜度和時(shí)間復(fù)雜度從而在某些情況下能夠簡(jiǎn)化運(yùn)算

對(duì)撞指針
類似于相遇問題,對(duì)撞指針是指在有序數(shù)組中,將指向最左側(cè)的索引定義為左指針,最右側(cè)的定義為右指針,然后分別從兩側(cè)出發(fā),相向遍歷鏈表,這個(gè)過程就形象化為對(duì)撞,習(xí)慣上就將左右指針定義為 left 和 right,我們給出一個(gè)大致代碼邏輯:
void hit(int *arr,int arrsize)
{
int* left = arr;
int* right = arr + arrsize -1;
while(left<=right)
{
條件語句;
left++;
條件語句;
right--;
}
}
對(duì)撞指針適用于二分查找,鏈表對(duì)象求和等,也就是說當(dāng)你遇到題目給定有序數(shù)組時(shí),應(yīng)該第一時(shí)間想到的思路就是使用對(duì)撞指針。
快慢指針
類似于龜兔賽跑,快慢指針是兩個(gè)鏈表上的指針從同一節(jié)點(diǎn)出發(fā),其中一個(gè)指針前進(jìn)速度比另一個(gè)快,兩個(gè)指針以不同的策略移動(dòng),直到兩個(gè)指針的值達(dá)成某個(gè)條件為止,如圖(ppt繪圖+手殘勿噴):

我們同樣將左右指針定義為 slow,fast,要實(shí)現(xiàn)其中一個(gè)指針比另一個(gè)快,我們無可厚非就兩種方法:
1.同時(shí)起步,fast 比 slow 多走n步;
2.fast 先走,slow后走;
那我們給出他的邏輯代碼:
同時(shí)走:
void speed(int *arr)
{
int* fast = arr;
int* slow = arr;
while(slow<fast)
{
條件;
slow++(非條件下fast++);
}
}
先后走:
void speed(int *arr)
{
int* slow =arr;
int* fast = arr;
while(條件1)
{
slow++;
}
while(條件2)
{
fast++;
}
}
真題實(shí)戰(zhàn)
1.調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面
int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
*returnSize = arrayLen;
int* left = array;
int* right = array + arrayLen - 1;
while (left < right)//(1)
{
while (left < right && *left % 2 == 1)//(2)
left++;
while (left < right && *right % 2 == 0)//(3)
right--;
if (left < right)//(4)
{
int tmp = *left;
*left = *right;
*right = tmp;
}
left++;
right--;
}
return array;
}
這道題就是典型的對(duì)撞指針,我們遍歷完整個(gè)數(shù)組時(shí),左右指針路程各自一半,只需要 left 尋找奇數(shù),right 尋找偶數(shù)做交換即可。
==Ps.==這里的* returnSize
2.Leetcode 真題:移除元素
int removeElement(int* nums, int numsSize, int val) {
int* p1 = nums;
int* p2 = nums;
int sz = numsSize;
for (; p1 < nums + numsSize; p1++)
{
if (*p1 != val)
{
*p2 = *p1;
*p2++;
}
else
sz--;
}
return sz;
}
這是典型的快慢指針,第一個(gè)指針用來遍歷數(shù)組元素,判斷是不是要?jiǎng)h除的數(shù),第二個(gè)指針用來存放數(shù)字。如果第一個(gè)指針指向的是要?jiǎng)h除的元素,那么輸出用來存放輸出數(shù)組元素個(gè)數(shù)的整形變量sz就自減 1,然后第一個(gè)指針向后移動(dòng)一位,第二個(gè)指針不動(dòng);如果第一個(gè)指針指向的不是要?jiǎng)h除的數(shù),那么就把這個(gè)數(shù)放到第二個(gè)指針指向的位置,然后第一個(gè)指針和第二個(gè)指針都向后移動(dòng)一位。重復(fù)操作直到第一個(gè)指針遍歷整個(gè)數(shù)組,此方法的時(shí)間復(fù)雜度是O(n)。
今天就到這里了,摸了家人們,情人節(jié)快樂!更多關(guān)于C語言雙指針?biāo)惴ǖ馁Y料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何利用C語言實(shí)現(xiàn)最簡(jiǎn)單的HTTP服務(wù)器詳解
這篇文章主要給大家介紹了關(guān)于如何利用C語言實(shí)現(xiàn)最簡(jiǎn)單的HTTP服務(wù)器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
C/C++可變參數(shù)函數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了C/C++可變參數(shù)函數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
C語言基于graphics.h實(shí)現(xiàn)圣誕樹
這篇文章主要介紹了圣誕樹代碼,c語言編程,基于graphics.h實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12

