18. 4Sum

1.問題

2.想法

  • 提問

  • function header, parameter

  • test input

  • 說明想法

    • 對序列後排序

    • 跟3 sum的做法很像, 但使用3個迴圈

    • 由於edge case會出現類似(0, 0 ,0, 0), 因此不能像3 sum一樣跳過重複的字母

      • 用set來記錄vector, 最後再將set轉為vector

return vector<vector<int>>(res.begin(), res.end());
  • 分別使用4個指標, 依題意的目的是要總和為target

    • 若總和 == 0, 則記錄i, j , k, l的數值

    • 若總和 < 0, 則表示總和太小, 讓k++

    • 若總和 > 0, 則表示總和太大, 讓l--

  • 測試計算複雜度: O(n^3) ?

3.程式碼

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        int size = nums.size();
        set<vector<int>> res;
        sort(nums.begin(), nums.end());
        
        for (int i = 0; i < size - 3; i++) {
            for (int j = i + 1; j < size - 2; j++) {
                int k = j + 1;
                int l = size - 1;
                while (k < l) {
                    int sum = nums[i] + nums[j] + nums[k] + nums[l];
                    if (sum == target) {
                        res.insert({nums[i], nums[j], nums[k], nums[l]});
                        k++;
                        l--;
                    } else if (sum < target) {
                        k++;
                    } else {
                        l--;
                    }
                }
            }    
        }
            
        return vector<vector<int>>(res.begin(), res.end());
    }
};

Last updated