解題思路
有兩個地方會造成 duplicate:
一、第一層 for loop 的數值相同
譬如 [-4, -1, -1, 0, 1, 2] ,會先看到 index = 1 的那個 -1 ,找出解 [-1, 0, 1]。接著來到 index = 2 的 -1,這時又找出同樣的 [-1, 0, 1] 這組解。
要避免這種情況,必須檢查是不是跟前面的數值相同。
二、找 second, third 時數值相同
譬如 [-2, 0, 0, 2, 2],會找到同樣的兩組 [-2, 0, 2]。
要避免這種情況,在移動 left, right 時也要檢查。
程式碼
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(), nums.end()); vector<vector<int>> ans; for(int i=0; i<nums.size() - 2; i++) { if(i != 0 && nums[i] == nums[i-1]) continue; int left = i+1, right = nums.size() - 1; while(left < right) { if(left > i+1 && right < nums.size() - 1 && nums[left] == nums[left - 1] && nums[right] == nums[right + 1]) { left += 1; right -= 1; continue; } int sum = nums[i] + nums[left] + nums[right]; if(sum == 0) { ans.push_back({nums[i], nums[left], nums[right]}); left += 1; right -= 1; } else if(sum < 0) left += 1; else right -= 1; } } return ans; } };
沒有留言:
張貼留言