leetcode 3Sum C++
荒廢好久沒更新了,時(shí)間過得很快,轉(zhuǎn)眼就2017年了,經(jīng)歷了苦悶的科研階段,發(fā)了論文順利畢業(yè);也經(jīng)過三地輾轉(zhuǎn)奔波來去的找工作,最終還是猶猶豫豫選擇了自己知道以后可能會后悔的,果然就后悔了。所以還是應(yīng)該選擇自己喜歡的,當(dāng)然也許人總是會這樣,總覺得沒走的另一條路也許走起來更暢通。
Given an array?S?of?n?integers, are there elements?a,?b,?c?in?S?such that?a?+?b?+?c?= 0? Find all unique triplets in the array which gives the sum of zero.
解題思路:本題的思路與2 sum類似,首先對數(shù)組進(jìn)行排序,然后依次把每位數(shù)字當(dāng)做target,用類似于處理2 sum的思路進(jìn)行兩邊掃描向中間逼近的處理。只是在此題中要注意重復(fù)的問題。
左數(shù)從i+1開始,可以理解為處理的sum[i]作為三個(gè)數(shù)中的最左值,從此數(shù)的右邊第一位和數(shù)據(jù)的最后一位向中間靠攏尋找符合的數(shù)字組合。如果把sum[i]作為中間的值來處理則存在找出重復(fù)數(shù)組的風(fēng)險(xiǎn),如下:
input:-1、-1、0、1、2output:[-1,-1,2] [0,-1,1] [1,-1,0]....//可以看到如果允許跨過target本身去尋找,就存在重復(fù)的風(fēng)險(xiǎn) int left = i + 1; int right = nums.size() - 1;
因?yàn)閿?shù)組已經(jīng)是排過序的,因此檢查如下語句,避免作為左值的數(shù)重復(fù)。
if(i > 0 && nums[i] == nums[i - 1]) //continue;數(shù)組中可能存在不止一組數(shù)字的和與target相加的值等于零,因此兩邊繼續(xù)向內(nèi)掃描,如下兩句則是避免中間數(shù)字和右邊數(shù)字重復(fù)的問題。
while(left < right && nums[left] == nums[left + 1]) left++; while(left < right && nums[right] == nums[right -1 ]) right--;
完整代碼如下:
class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> resl;int length = nums.size();if(length < 3)return resl;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size() - 1; ++i){if(i > 0 && nums[i] == nums[i - 1])continue;int left = i + 1;int right = nums.size() - 1;while(left < right){vector<int> temp;if(nums[i] + nums[left] + nums[right] == 0){temp.push_back(nums[i]);temp.push_back(nums[left]);temp.push_back(nums[right]);while(left < right && nums[left] == nums[left + 1]) left++;while(left < right && nums[right] == nums[right -1 ]) right--;left++;right--;}else if (nums[i] + nums[left] + nums[right] < 0)++left;else --right;if(temp.size() > 0)resl.push_back(temp);}}return resl;} };??
轉(zhuǎn)載于:https://www.cnblogs.com/echo-lsh/p/6496911.html
總結(jié)
以上是生活随笔為你收集整理的leetcode 3Sum C++的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到拉屎打什么码
- 下一篇: 最长回文子串 C++