CREATED TIME: Dec 24, 2019 1:20 AM UPDATED TIME: Dec 25, 2019 11:34 PM 난이도: Medium
접근한 풀이법들
- n^2 + hash_map
- n^2으로 쌍을 묶고, 0-해당값 에 해당하는 value가 존재하는지 체크
- 하지만 결과에 대한 중복을 다시 한번 처리해줘야함.
- 소팅을 해야겠다는 생각이 듬.
- two pointer
- 소팅을 하고
- 가장 작은 값을 고정해두고
- 두 포인터를 범위 내 가장 큰값, 가장 작은값으로 설정.
- 범위는 가장 작은값을 설정한 index+1 부터.
- 투포인터로 합이 0이되는지점 찾기
- [-1, 0, 0, 1, 1] 같이 같은 값이 중복될 경우가 존재.
- 따라서 합이 0이 된 경우 똑같은 값을 넘어가도록 한번 더 반복을 넣어줌.
class Solution { public: vector<vector
> threeSum(vector & nums) { vector<vector > res; if (nums.empty()){ return res; } sort(nums.begin(), nums.end()); int length = nums.size(); for(int i = 0; i < length - 2; i++){ if(i == 0 || nums[i] != nums[i-1]){ int left = i+1; int right = length-1; while(left < right){ int sum = nums[i] + nums[left] + nums[right]; if(sum == 0){ vector<int> vc{nums[i], nums[left], nums[right]}; res.push_back(vc); while(left < right && nums[left] == nums[left + 1] && nums[right] == nums[right - 1]){ left++; right--; } left++; right--; }else if(sum > 0){ right--; }else{ left++; } } } } return res; } };