LeetCode 18 Medium
解题思路:
四数之和问题等价于三数之和问题,设置i,j,k,m四个指针。
- 首先判断如何nums为空,则返回空的vector,并对nums进行排序
- 对边界情况进行判断,如果nums[i]>0 and nums[i] target,则直接跳出循环,因为后面的元素于也一定比target大,如果nums[i]和nums[i-1]重复了,则中止本次循环,防止重复添加
- 重新设置new_target = target-nums[i],里面就是三数之和的算法,并且利用双指针解法进行优化
- 时间复杂度:O(n³)
- 空间复杂度:O(n²)
结果:
代码:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int i,j,k,m;
vector< vector<int> > final_vect;
if(nums.size() < 4){
return final_vect;
}
//将vector进行排序
sort(nums.begin(),nums.end());
//首先将两个数之和登记在注册表之中
for(i=0;i<nums.size();i++){
if(i > 0 && nums[i] == nums[i-1]){
continue;
}
if( nums[i] > 0 && nums[i] > target){
break;
}
int new_target = target - nums[i];
//利用双指针法,寻找新的三数之和
for(j=i+1;j<nums.size();j++){
if(j > (i+1) && nums[j] == nums[j-1]){
continue;
}
if( nums[j] > 0 && nums[j] > new_target){
break;
}
k=j+1;
m=nums.size()-1;
while(k<m){
vector<int> four_sum;
int sum = nums[j]+nums[k]+nums[m];
if(sum == new_target){
four_sum.push_back(nums[i]);
four_sum.push_back(nums[j]);
four_sum.push_back(nums[k]);
four_sum.push_back(nums[m]);
final_vect.push_back(four_sum);
k++;m--;
while(k<m && nums[k] == nums[k-1]){
k++;
}
while(k<m && nums[m] == nums[m+1]){
m--;
}
}
if(sum > new_target){
m--;
while(k<m && nums[m] == nums[m+1]){
m--;
}
}
if(sum < new_target){
k++;
while(k<m && nums[k] == nums[k-1]){
k++;
}
}
}
}
}
return final_vect;
}
};