LeetCode15题, 在数组中找出所有和为0的、不重复的3个数
重点
- 排序后,先取第一个数,左右夹逼取第二个数和第三个数。
- 要保证前两个数的值不重复。
- 要保证第一个数的值不重复,只需要第一个数的值前面没有取过即可
- 要保证第二个数的值不重复,只需要第二个数的值前面也没有取过即可
#include<iostream> #include <algorithm> #include <utility> #include<string> #include<vector> #include<float.h> #include<map> #include<memory.h> #include<cstring> #include<math.h> #include<sstream> #include<set> using namespace std; class Solution { public: /* 排序后,先取第一个数,左右夹逼取第二个数和第三个数。 要保证前两个数的值不重复。 要保证第一个数的值不重复,只需要第一个数的值前面没有取过即可 要保证第二个数的值不重复,只需要第二个数的值前面也没有取过即可 */ vector<vector<int> > threeSum(vector<int>& nums) { vector<vector<int> > result; if (nums.size() < 3) return result; sort(nums.begin(), nums.end()); for (int i = 0; i < nums.size()-2; i++) { if (nums[i] <= 0 && (i == 0 || nums[i] != nums[i-1])) // 第一个数要<=0或者前面没有取过 { int L = i+1; int R = nums.size()-1; while(R > L) { if (nums[i] + nums[L] + nums[R] > 0) R--; else if (nums[i] + nums[L] + nums[R] < 0) L++; else { vector<int> temp(3, 0); temp[0] = nums[i]; temp[1] = nums[L]; temp[2] = nums[R]; result.push_back(temp); while(R > L && L+1 < nums.size() && nums[L+1] == nums[L]) L++; // 第二个数的值前面没有取过 L++; } } } } return result; } }; int main(void) { int a[] = { -1,0,1,2,-1,-4}; vector<int> nums(a, a+6); Solution b; vector<vector<int> > t = b.threeSum(nums); for (int i = 0; i < t.size(); i++) { cout << t[i][0] << ' '; cout << t[i][1] << ' '; cout << t[i][2] << ' ' << endl; } cout << endl << endl << endl; return 0; }