力扣做題學習筆記(防忘) 雙指標

2021-10-17 20:13:13 字數 1823 閱讀 8301

總結總結幾道雙指標的題目,以後便於複習雙指標

通過舉例來發現雙指標比兩層迴圈更優的原因

例如:nums= target:14

若使用兩層迴圈則要計算10次:

(1,-2)(1,7)(1,9)(1,5)(-2,7)(-2,9)(-2,5)(7,9)(9,5)

**如下:

vector<

int>

twosum

(vector<

int>

& nums,

int target);}

}}return

;}

而使用雙指標則可以減少運算次數,但先要利用sort對陣列進行排序,將陣列變為乙個單調遞增的陣列。

雙指標的使用:指標 i 指向陣列頭部,即 i=0;指標 j 指向陣列尾部,即 j=nums.size()-1

然後對nums[i]+nums[j]進行處理:

1.nums[i]+nums[j]>target

指標 j 向前退乙個,使nums[i]+nums[j]減小

2.nums[i]+nums[j]=target

直接返回結果

3.nums[i]+nums[j]=j,而還沒有返回結果,那就使無解了

按照這樣計算,僅需要算(-2,9)(1,9)(5,9)即可

**如下:

vector<

int>

twosum

(vector<

int>

& nums,

int target)

else

if(s==target);}

else

}return

;}

三數之和

**如下:

vectorint>>

threesum

(vector<

int>

& nums)

int i,j;

i=index+1;

j=n-1;

int target=

-nums[index]

;while

(ielse

else

if(nums[i]

+nums[j]

else

if(nums[i]

+nums[j]

==target));

i++;}

}}}return ans;

}

四數之和

**如下:

vectorint>>

foursum

(vector<

int>

& nums,

int target)

for(id1=

0;id1)for

(id2=id1+

1;id2)int i=id2+1;

int j=n-1;

int sum=nums[id1]

+nums[id2]

;while

(ielse

else

if(s+sumelse

if(s+sum==target));

i++;}

}}}}

return result;

}

利用雙指標可以在保證空間複雜度不變(為o(1))的情況下,將時間複雜度降低一次方,如三數之和o(n

3)

−>o(

n2

)o(n^)->o(n^)

o(n3)−

>o(n2)

雙指標法的例題彙總(C 力扣)

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,則輸出任意一對即可。示例 1 輸入 nums 2,7,11,15 target 9 輸出 2,7 或者 7,2 示例 2 輸入 nums 10,26,30,31,47,60 target 40 輸...

力扣125 驗證回文串(雙指標 內建函式)

力扣125.驗證回文串 雙指標 內建函式 給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。說明 本題中,我們將空字串定義為有效的回文串。示例 1 輸入 a man,a plan,a canal panama 輸出 true 示例 2 輸入 race a car 輸出 f...

力扣141 環形鍊錶(雙指標)

力扣141.環形鍊錶 雙指標 給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部...