c_cpp 15. 3Sum- Med - 2018.11.1
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 15. 3Sum- Med - 2018.11.1相关的知识,希望对你有一定的参考价值。
class Solution {
public:
// 快排
void sort(vector<int>& nums, int left, int right) {
if (left >= right) {
return;
}
int i = left;
int j = right;
int tmp = nums[left];
while (i < j) {
// j找小于tmp的数
while (nums[j] >= tmp
&& i < j) {
j--;
}
// i找小于tmp的数
while (nums[i] <= tmp
&& i < j) {
i++;
}
// i和j的值互换
if (i < j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
nums[left] = nums[i];
nums[i] = tmp;
sort(nums, left, i-1);
sort(nums, i+1, right);
}
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> re;
map<string, int> reHash;
int left = 0;
int right = 0;
int target;
sort(nums, 0, nums.size()-1);
for (int i = 0; i < nums.size(); i++) {
left = i + 1;
right = nums.size()-1;
target = nums[i]*(-1);
while (left < right) {
if (nums[left] + nums[right] == target) {
vector<int> tmpVec{nums[i], nums[left], nums[right]};
string hash = to_string(nums[i]) + '#' + to_string(nums[left]) + '#' + to_string(nums[right]);
if (reHash[hash] != 1) {
re.push_back(tmpVec);
reHash[hash] = 1;
}
left++;
right--;
} else if (nums[left] + nums[right] > target) {
right--;
} else {
left++;
}
}
}
return re;
}
};
以上是关于c_cpp 15. 3Sum- Med - 2018.11.1的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 15. 3Sum
c_cpp 5.最长的回文子串 - Med - 2018.10.15
c_cpp 18. 4Sum- Med - 2018.11.6
c_cpp 8.字符串到整数atoi - Med - 2018.10.29
15 & 16. 3Sum & 3Sum Cloest
c_cpp [阵] 3sum最近。给定n个整数的数组S,在S中找到三个整数,使得总和最接近给定数字target。 Retur