總結總結幾道雙指標的題目,以後便於複習雙指標
通過舉例來發現雙指標比兩層迴圈更優的原因
例如: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 解釋 鍊錶中有乙個環,其尾部...