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

LeetCode-18-4Sum

4sum 一個數 lee 麻煩 tco target 解決 一點 i++

一、問題描述

  給定一個數組S,和一個int類型的數target,在S中尋找四個數,這四個數之和為target。返回一個vector<vector<int>>

  例子:S={1, 0, -1, 0, -2, 2},target = 0.返回結果為{{-1,0,0,1},{-2,1,1,2},{-2,0,0,2}}

二、問題解決

  最簡單的思路是四層循環,這樣不管是之前的3之和問題還是4之和問題都能解決,缺點就是比較費時,在leetcode上提交還可能超時。

  更好一點的方式是對數組進行排序之後,從兩邊逼近的方式。這樣可以減少一層循環,3數之和就先確定一個數,4數之和就先確定兩個數。本題下面的解法之中,固定i和j,讓k和l沖兩邊逼近。

  這題比較麻煩的是去重復。

vector<vector<int>> fourSum(vector<int>& nums, int target) {
    vector<vector<int>> result;
    if (nums.size() < 4) return result;
    sort(nums.begin(),nums.end());
    /*
    for (auto o : nums)
        cout << o;
    cout << endl;
    
*/ for (int i = 0; i < nums.size() - 3; i++) {
     //去除重復
while (i != 0 && nums.at(i - 1) == nums.at(i)) i++; for (int j = i + 1; j < nums.size() - 2; j++) {
       //去除重復
while (j != i + 1 && j+1 <nums.size()-1&& nums.at(j-1) == nums.at(j)) j
++; int k = j + 1, l = nums.size()-1; while (k < l) { //cout << i << j << k << l << endl; if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) == target) { vector<int> temp; temp.emplace_back(nums.at(i)); temp.emplace_back(nums.at(j)); temp.emplace_back(nums.at(k)); temp.emplace_back(nums.at(l)); result.emplace_back(temp);
            //去除重復
while (k + 1 < l && nums.at(k) == nums.at(k + 1)) k++; while (l-1 > k && nums.at(l) == nums.at(l - 1)) l--; k++; } if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) > target) l--; if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) < target) k++; } } } //result.erase(unique(result.begin(), result.end()),result.end()); return result; }

LeetCode-18-4Sum