[leetcode] 15. 3 Sum 문제 풀이 보고서
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4},
A solution set is:
(-1, 0, 1)
(-1, -1, 2)
사고: 방금 시작 한 사고 방향 은 정렬 + DFS 검색 + 역 추적 이 고 시간 복잡 도 는 O (n ^ 3) 이 며 시간 초과 입 니 다.
코드 는 다음 과 같 습 니 다:
class Solution {
public:
void DFS(vector<int>& nums, vector<int> tem, int index, int sum)
{
if(tem.size() == 3)// ,
{
if(sum == 0)
result.push_back(tem);
return;
}
if(index >= nums.size() || sum >0) return;
tem.push_back(nums[index]);
DFS(nums, tem, index+1, sum+nums[index]);
while(index+1 < nums.size() && nums[index+1] == nums[index])//
index++;
tem.pop_back();//
DFS(nums, tem, index+1, sum);
}
vector<vector<int>> threeSum(vector<int>& nums) {
int len = nums.size();
if(len ==0) return result;
sort(nums.begin(), nums.end());
vector<int> tem;
DFS(nums, tem, 0, 0);
return result;
}
private:
vector<vector<int>> result;
};
나중에 다른 사람의 답안 을 다시 보 니 이 문제 가 투 썸 문제 의 해법 으로 퇴화 할 수 있다 는 것 을 알 게 되 었 다.먼저 하나의 숫자 를 골 라 낸 다음 에 나머지 숫자 에서 두 개의 숫자 와 이 수 를 더 하면 0 과 같다 는 것 을 찾 아 문 제 를 2Sum 문제 로 바 꿀 수 있다.
하나의 수 를 target 으로 고 른 후에 이 수 와 관련 된 모든 해 를 찾 을 수 있 기 때문에 앞으로 이 수 를 검색 하지 않 으 면 중복 해 가 있 을 수 있 습 니 다.
밤 들 기: - 10, - 5, - 5, 5, 5, 6, 10
첫 번 째 는 - 10 을 target 으로 하고 - 5, - 5, 5, 5, 6, 10 에서 검색 결 과 를 얻 습 니 다.
두 번 째 는 - 5 를 target 으로 하고 - 5, 5, 5, 6, 10 에서 결 과 를 고 르 세 요.
세 번 째 로 5 를 target 으로, 5, 6, 10 중에서 결 과 를 고 르 는데, 이번 에는 하 나 를 건 너 뛰 었 습 니 다. - 5 를 target 으로 하 는 해 를 찾 았 기 때 문 입 니 다.
응!이렇게 코드 는 다음 과 같 습 니 다.
class Solution {
public:
void twoSum(vector<int>& nums, int left, int target)
{
int right = nums.size() -1;
while(left < right)
{
int value = nums[left] + nums[right] + target;
if(value == 0)//
{
vector<int> tem;
tem.push_back(target);
tem.push_back(nums[left++]);
tem.push_back(nums[right--]);
result.push_back(tem);
while(nums[left] == nums[left-1]) left++;//
while(nums[right] == nums[right+1]) right--;//
}
else if(value < 0)
left++;
else if(value > 0)
right--;
}
}
vector<vector<int>> threeSum(vector<int>& nums) {
int len = nums.size();
if(len ==0) return result;
sort(nums.begin(), nums.end());
for(int i =0; i< len-1; i++)// target
{
if(i >0 && nums[i] == nums[i-1])
continue;
twoSum(nums, i+1, nums[i]);
}
return result;
}
private:
vector<vector<int>> result;
};
두 번 째 방법 참고:http://www.sigmainfy.com/blog/summary-of-ksum-problems.html
2016 - 02 - 24 재 편집
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
if(nums.size() == 0) return result;
sort(nums.begin(), nums.end());
int len = nums.size();
for(int i = 0; i< len -2; i++)
{
int left = i+1, right = len-1;
while(left < right)
{
int val = nums[left] + nums[right] + nums[i];
if(val ==0)
{
result.push_back(vector<int>{nums[i], nums[left], nums[right]});
while(nums[left] == nums[left+1]) left++;
while(nums[right] == nums[right-1]) right--;
left++, right--;
}
else if(val > 0) right--;
else left++;
}
while(i+1 < len && nums[i] == nums[i+1])
i++;
}
return result;
}
private:
vector<vector<int>> result;
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 문자열 입력으로 모든 유효한 IP 주소 생성(LeetCode 93번 문제)이 문제의 공식 난이도는 Medium으로 좋아요 1296, 반대 505, 통과율 35.4%를 눌렀다.각 항목의 지표로 말하자면 보기에는 약간 규범에 맞는 것 같지만, 실제로도 확실히 그렇다.이 문제의 해법과 의도는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.