學(xué)完html怎么做網(wǎng)站網(wǎng)絡(luò)營(yíng)銷工程師培訓(xùn)
題目? :給你一個(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ù)的三元組。
在解決這一問(wèn)題中,我們需要用到相向雙指針。
首先需要對(duì)數(shù)組nums 排好序,便于之后的各種操作。
從數(shù)組第一個(gè)數(shù)num[now] 開始向后遍歷,?如果now now+1 now+2 三個(gè)數(shù)和大于0,在這種情況下,當(dāng)前剩下的最小的三個(gè)數(shù)和仍大于0,那么便沒(méi)有能使之后的數(shù)的和都大于0,結(jié)束循環(huán);同樣,如果now end end-1 三個(gè)數(shù)的和小于0,在這種情況下,當(dāng)前數(shù) 與剩下的最大的兩個(gè)數(shù)和仍小于0,那么便沒(méi)有能使之后的數(shù)的和都小于0,now++,進(jìn)行下一次判斷;如果num[now] 與上一個(gè)數(shù)相同,now++,進(jìn)行下一次判斷。 將數(shù)組排序好的好處之一便在此。需要注意的是,now 在整個(gè)循環(huán)中應(yīng)當(dāng)小于 size - 2 ,因?yàn)樽钌賾?yīng)剩下三個(gè)數(shù)。
在有一個(gè)符合上述條件的now 時(shí):
while (next < last) {if (nums[now] + nums[next] + nums[last] < 0)next++;else if (nums[now] + nums[next] + nums[last] > 0)last--;else {//針對(duì)每一個(gè)不同的新的數(shù),找出不同的兩個(gè)數(shù),使三數(shù)的和為0vv.push_back({ nums[now] ,nums[next], nums[last] });//next++;last--;while (next <= end && nums[next] == nums[next - 1])//三數(shù)等于0后,判斷next end之后的數(shù)是否分別與它們相同next++;while (last >= 0 && nums[last] == nums[last + 1])last--; }}
class Solution {
public: vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> vv;sort(nums.begin(),nums.end());int now = 0;while (now < nums.size() - 2) {int end = nums.size() - 1;if (now != 0 && nums[now] == nums[now - 1]){now++;continue;}if (nums[now] + nums[now + 1] + nums[now + 2] > 0)break;if (nums[now] + nums[end] + nums[end - 1] < 0){now++;continue;}int next = now + 1;int last = end;while (next < last) {if (nums[now] + nums[next] + nums[last] < 0)next++;else if (nums[now] + nums[next] + nums[last] > 0)last--;else {//針對(duì)每一個(gè)不同的新的數(shù),找出不同的兩個(gè)數(shù),使三數(shù)的和為0vv.push_back({ nums[now] ,nums[next], nums[last] });//next++;last--;while (next <= end && nums[next] == nums[next - 1])//三數(shù)等于0后,判斷next end之后的數(shù)是否分別與它們相同next++;while (last >= 0 && nums[last] == nums[last + 1])last--; }}now++;}return vv;}
};