您的位置:首页 > 其它

算法练习(8):4Sum

2017-09-26 20:58 274 查看


题意:因为上一道题刚好是找出三个数的,这次是找出四个数的,所以就刚好放在一起做了。

分析与思路:这次的解法跟上一道题的解法思路,完全一模一样,不需要改变算法,只需要在最外层再加一层循环,并不会超时。所以还是直接上代码吧

代码:

class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
if (nums.size() == 0 || nums.size() < 4) {//不满足条件的情况
return result;
}
sort(nums.begin(), nums.end());//对数组排序
for (int t = 0; t < nums.size() - 3; t++) {
if (t > 0 && nums[t] == nums[t - 1]) continue;
for (int it = t + 1; it < nums.size() - 2; it++) {
if (it > 0 && t != it - 1 && nums[it] == nums[it - 1]) continue;//对于同目标值的元素可以跳过,因为重复了
int targett = target - (nums[it]+nums[t]);
int l = it + 1, r = nums.size() - 1;//设置左右指针
while (l < r) {
if (nums[l] + nums[r] == targett) {
vector<int> re;
re.push_back(nums[t]);
re.push_back(nums[it]);
re.push_back(nums[l]);
re.push_back(nums[r]);
result.push_back(re);//把满足要求的组合加到答案中
while (nums[r] == nums[r - 1]) r--;//因为按照左指针不变的情况下,右值相同会得到相同组合
while (nums[l] == nums[l + 1]) l++;
r--;
l++;//已得匹配组合,则两端都需要移到分别跟原来不同值的位置才行
}
else {
if (nums[l] + nums[r] < targett) {//小于目标则左指针加1
l++;
}
else {
r--;
}
}
}
}
}
return result;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: