(写给未来遗忘的自己)
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> quaternion;
sort(nums.begin(), nums.end());
int n = nums.size();
for (int i = 0; i < n - 3; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue; // 跳过重复元素
for (int j = i + 1; j < n - 2; j++) {
if (j > i + 1 && nums[j] == nums[j - 1]) continue; // 跳过重复元素
int first_ptr = j + 1;
int last_ptr = n - 1;
while (first_ptr < last_ptr) {
long long sum =(long long)nums[i] + nums[j] + nums[first_ptr] + nums[last_ptr];
if (sum < target) {
first_ptr++;
} else if (sum > target) {
last_ptr--;
} else {
quaternion.push_back({nums[i], nums[j], nums[first_ptr], nums[last_ptr]});
while (first_ptr < last_ptr && nums[first_ptr] == nums[first_ptr + 1]) first_ptr++; // 跳过重复元素
while (first_ptr < last_ptr && nums[last_ptr] == nums[last_ptr - 1]) last_ptr--; // 跳过重复元素
first_ptr++;
last_ptr--;
}
}
}
}
return quaternion;
}
};
注意:这个题目的思路和三数之和的思路一样,就是多加一层的for循环。
注意数据溢出。(采用 long long )(三数之和的时候没考虑,这个是测试案例暴了之后才改的。)