做網(wǎng)站設(shè)計(jì)提成賺錢嗎百度百度一下官網(wǎng)
題目鏈接
力扣15.三數(shù)之和
題目描述
給你一個(gè)整數(shù)數(shù)組?nums
?,判斷是否存在三元組?[nums[i], nums[j], nums[k]]
?滿足?i != j
、i != k
?且?j != k
?,同時(shí)還滿足?nums[i] + nums[j] + nums[k] == 0
?。請(qǐng)
你返回所有和為?0
?且不重復(fù)的三元組。
注意:答案中不可以包含重復(fù)的三元組。
示例 1:
輸入:nums = [-1,0,1,2,-1,-4] 輸出:[[-1,-1,2],[-1,0,1]] 解釋: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。 nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。 nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。 不同的三元組是 [-1,0,1] 和 [-1,-1,2] 。 注意,輸出的順序和三元組的順序并不重要。
示例 2:
輸入:nums = [0,1,1] 輸出:[] 解釋:唯一可能的三元組和不為 0 。
示例 3:
輸入:nums = [0,0,0] 輸出:[[0,0,0]] 解釋:唯一可能的三元組和為 0 。
提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105
思路分析
知識(shí)點(diǎn):雙指針、碰撞指針、排序
解析:
首先我們對(duì)于給定數(shù)組先進(jìn)行排序,然后再使用雙指針?biāo)惴ㄟM(jìn)行實(shí)現(xiàn)。
具體步驟
1.先進(jìn)行排序。
2.從第一個(gè)數(shù)開始進(jìn)行固定(當(dāng)前位置為i)定義左右兩個(gè)指針left,right,left每次從i的下一個(gè)位置開始,而right每次都從最右邊開始。
3.每次求出left和right所指向的數(shù)的和,看看這個(gè)和是否等于i位置的倒數(shù),如果大,right--,如果小,left++,直到找到匹配的數(shù)后,將結(jié)果存放到返回?cái)?shù)組里,此時(shí)left++和right--同時(shí)進(jìn)行。
4.為了避免出現(xiàn)重復(fù)結(jié)果,我們之前已經(jīng)對(duì)數(shù)組進(jìn)行了排序,假設(shè)此時(shí)left和right指向的值的和滿足條件,又因?yàn)榕判蚝筮B續(xù)的數(shù)會(huì)放到一起,所以left后面和right前面就會(huì)存在重復(fù)元素,此時(shí)我們需要跳過它,同時(shí)也要避免left>right,因?yàn)榍懊嫫ヅ浜髄efti已經(jīng)移動(dòng)了一次,如果用left后面的值當(dāng)作判斷的話,可能left的下一個(gè)元素是新元素,而此時(shí)left還在重復(fù)元素上,所以要有l(wèi)eft前面的值進(jìn)行判斷,right也是一樣,反過來(lái)就行。
5.匹配完后,i就要繼續(xù)向下移動(dòng),而i也會(huì)存在重復(fù)元素的問題,也要記得查重。
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;//用于存儲(chǔ)返回值sort(nums.begin(),nums.end());int n=nums.size();int i=0;while(i<n){if(nums[i]>0) break;//小優(yōu)化,因?yàn)閕位置大于0的話,后面不可能有數(shù)相加等于它int left=i+1,right=n-1,target=-nums[i];while(left<right){int sum=nums[left]+nums[right];if(sum>target) right--;else if(sum<target) left++;else{ret.push_back({nums[left],nums[right],nums[i]});left++;right--;while(left<right&&nums[left]==nums[left-1]) left++;while(left<right&&nums[right]==nums[right+1]) right--;}}i++;while(i<n&&nums[i]==nums[i-1]) i++;}return ret;}
};