求一個隊列中三個之和爲0的子列,並以非遞減的順序輸出。思路如下:
step1: 枚舉每個num[i],i=0--n;
step2:設置j=i+1,k=n-1;依次判斷num[i]+num[j]+num[k]=0?並根據其和與0的大小關係對j和k做調整;
step3:爲避免重複,必須對每個num[i],num[j],num[k]做判斷,看它們是否與其前面的整數相等,若相等則直接跳過。
具體代碼如下:
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>> result;
result.clear();
sort(num.begin(),num.end());
int i,j,k;
for(i=0;i<num.size();i++)
{
if(i>0&&num[i]==num[i-1]) continue;
j=i+1;
k=num.size()-1;
while(j<k)
{
if(j>i+1&&num[j]==num[j-1])
{
j++;
continue;
}
if(k<num.size()-1 && num[k]==num[k+1])
{
k--;
continue;
}
int sum=num[i]+num[j]+num[k];
if(sum>0) k--;
else if(sum<0) j++;
else{
vector<int> tmp;
tmp.push_back(num[i]);
tmp.push_back(num[j]);
tmp.push_back(num[k]);
result.push_back(tmp);
j++;
k--;
}
}
}
return result;
}
};