1. 程式人生 > >18. 4 Sum

18. 4 Sum

題目:

解答:

與之前的三數之和的解法類似,也是先排序,然後不斷剔除不可能的條件,最後兩個引數,通過兩頭求和計算得出。

程式碼:

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)