LeetCode : 3 sum

解法:先排序,然后固定第一指针,第二和第三分别位于第一指针后面和尾部,向中间寻找。
注意重复值的丢弃(如果不丢弃,会超时)
1 class Solution { 2 public: 3 vector<vector<int> > threeSum(vector<int> &num) { 4 vector<int> tmp; 5 vector<vector<int> > result; 6 7 sort(num.begin(),num.end()); /*先排序,再查找*/ 8 9 for(int i=0;i!=num.size();++i) 10 { 11 if(i>0 && (num[i]==num[i-1])) /*找出与前一个数不一样的数*/ 12 { 13 continue; 14 } 15 16 for(int j=i+1,k=num.size()-1;j<k;) /*初始j代表i后面的第一个元素,k代表最后一个元素*/ 17 { 18 if(j>i+1 && num[j]==num[j-1]) /*如果j和前一个元素相等,不用比较,直接后移*/ 19 { 20 ++j; 21 continue; 22 } 23 if(k<num.size()-1 && num[k]==num[k+1]) /*如果k和后一个元素相等,不用比较,直接前移*/ 24 { 25 --k; 26 continue; 27 } 28 29 int sum=num[i]+num[j]+num[k]; 30 if(sum>0) /*根据大小关系移动j和k的指向(i固定不变)*/ 31 { 32 --k; 33 } 34 else if(sum<0) 35 { 36 ++j; 37 } 38 else 39 { 40 tmp.push_back(num[i]); 41 tmp.push_back(num[j]); 42 tmp.push_back(num[k]); 43 result.push_back(tmp); 44 tmp.clear(); /*每次用完tmp要清空*/ 45 ++j; 46 } 47 } 48 } 49 return result; 50 } 51 };

浙公网安备 33010602011771号