18. 4 Sum
阿新 • • 發佈:2018-11-11
題目:
解答:
與之前的三數之和的解法類似,也是先排序,然後不斷剔除不可能的條件,最後兩個引數,通過兩頭求和計算得出。
程式碼:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
int len = nums.size();
if(len < 4) return result;
sort(nums.begin(), nums.end());
for(int i = 0;i < len - 3;){
if(nums[i] * 4 > target) break;
for(int j = i + 1;j < len - 2;){
if((nums[i] + nums[j]) * 2 > target) break;
int remain = target - nums[i] - nums[ j];
int begin = j + 1, end = len - 1;
while(begin < end){
int tmp = nums[begin] + nums[end];
if(tmp > remain){
while(begin < end && nums[end-1] == nums[end])
-- end;
--end;
}
else if(tmp < remain){
while(begin < end && nums[begin+1] == nums[begin])
++begin;
++begin;
}
else{
vector<int> vec({nums[i], nums[j], nums[begin], nums[end]});
result.push_back(vec);
while(begin < end && nums[end-1] == nums[end])
--end;
while(begin < end && nums[begin+1] == nums[begin])
++begin;
--end, ++begin;
}
}
while(j < len - 2 && nums[j+1] == nums[j]) ++j;
++j;
}
while(i < len - 3 && nums[i+1] == nums[i]) ++i;
++i;
}
return result;
}
};
更新會同步在我的網站更新(https://zergzerg.cn/notes/webnotes/leetcode/index.html)