1. Sum of nums[i], nums[l], nums[r] is less than target, move the left pointer.
2. Sum of nums[i], nums[l], nums[r] is larger than target, move the right pointer.
3. Target is found, save the triple elements.
Since the problem requires the result to exclude dups, I first tried to use set to store the triples but got TLE. Then I have to add line 8, 13-14 to achieve the requirement.
1: class Solution {
2: public:
3: vector<vector<int>> threeSum(vector<int>& nums) {
4: vector<vector<int>> res;
5: if (nums.size() < 3) return res;
6: sort(nums.begin(), nums.end());
7: for (int i = 0; i < nums.size()-2; i++) {
8: if (i == 0 || nums[i-1] != nums[i]) {
9: int l = i+1, r = nums.size()-1, t = -nums[i];
10: while (l < r) {
11: if (nums[l]+nums[r]==t) {
12: res.push_back(vector<int>{nums[i],nums[l],nums[r]});
13: while ((l < r) && (nums[l] == nums[l+1])) l++;
14: while ((l < r) && (nums[r] == nums[r-1])) r--;
15: l++, r--;
16: }
17: else if (nums[l]+nums[r]<t) l++;
18: else r--;
19: }
20: }
21: }
22: return res;
23: }
24: };
No comments:
Post a Comment