目录
1. 两数之和
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
for (int i = 0; i < nums.size(); i ++ ) {
int r = target - nums[i];
if (hash.count(r)) return {hash[r], i};
hash[nums[i]] = i;
}
return {};
}
};
15. 三数之和
要去掉重复的方案
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& a) {
vector<vector<int>> res;
int n = a.size();
sort(a.begin(), a.end());
for (int i = 0; i < n; i++) {
//去掉重复方案
if (i > 0 && a[i] == a[i - 1]) continue;
for (int j = i + 1, k = n - 1; j < k; j++) {
//去掉重复方案
if (j > i + 1 && a[j] == a[j - 1]) continue ;
//找到>=k的第一个数,同时去掉重复的k的方案
while (j < k - 1 && a[i] + a[j] + a[k - 1] >= 0) k--;
if (a[i] + a[j] + a[k] == 0) res.push_back({a[i], a[j], a[k]});
}
}
return res;
}
};
16. 最接近的三数之和
排序,然后双指针. 时间复杂度为O(N^2)
wikipedia扩展阅读
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int ans = nums[0] + nums[1] + nums[2];
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
int l = i + 1, r = nums.size() - 1;
while (l < r) {
if (abs(nums[i] + nums[l] + nums[r] - target) < abs(ans - target))
ans = nums[i] + nums[l] + nums[r];
if (nums[i] + nums[l] + nums[r] == target) return target;
else if (nums[i] + nums[l] + nums[r] < target) l++;
else r--;
}
}
return ans;
}
};
18. 四数之和
题目要求去掉重复的方案.
做法: 先排序,然后枚举i, j, 然后双指针算法,时间复杂度为O(N^3)
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<vector<int>> res;
for (int i = 0; i < nums.size(); i ++ ) {
if (i && nums[i] == nums[i - 1]) continue;
for (int j = i + 1; j < nums.size(); j ++ ) {
if (j > i + 1 && nums[j] == nums[j - 1]) continue;
for (int k = j + 1, u = nums.size() - 1; k < u; k ++ ) {
if (k > j + 1 && nums[k] == nums[k - 1]) continue;
while (u - 1 > k && nums[i] + nums[j] + nums[k] + nums[u - 1] >= target) u -- ;
if (nums[i] + nums[j] + nums[k] + nums[u] == target) {
res.push_back({nums[i], nums[j], nums[k], nums[u]});
}
}
}
}
return res;
}
};
454. 四数相加 II
分组,然后使用哈希表统计,时间复杂度为O(N^2)
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
unordered_map<int, int> cnt;
for (auto c: C)
for (auto d: D)
cnt[c + d] ++ ;
int res = 0;
for (auto a: A)
for (auto b: B)
res += cnt[-(a + b)];
return res;
}
};