中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么實現四數之和

發布時間:2022-03-28 10:31:41 來源:億速云 閱讀:214 作者:iii 欄目:大數據

這篇文章主要介紹了C++怎么實現四數之和的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++怎么實現四數之和文章都會有所收獲,下面我們一起來看看吧。

4Sum 四數之和

Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)

  • The solution set must not contain duplicate quadruplets.

    For example, given array S = {1 0 -1 0 -2 2}, and target = 0.

A solution set is:
(-1,  0, 0, 1)
(-2, -1, 1, 2)
(-2,  0, 0, 2)

LeetCode 中關于數字之和還有其他幾道,分別是 Two Sum ,3Sum ,3Sum Closest,雖然難度在遞增,但是整體的套路都是一樣的,在這里為了避免重復項,我們使用了 STL 中的 TreeSet,其特點是不能有重復,如果新加入的數在 TreeSet 中原本就存在的話,插入操作就會失敗,這樣能很好的避免的重復項的存在。此題的 O(n^3) 解法的思路跟 3Sum 基本沒啥區別,就是多加了一層 for 循環,其他的都一樣,代碼如下:

解法一:

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

但是畢竟用 TreeSet 來進行去重復的處理還是有些取巧,可能在 Java 中就不能這么做,那么還是來看一種比較正統的做法吧,手動進行去重復處理。主要可以進行的有三個地方,首先在兩個 for 循環下可以各放一個,因為一旦當前的數字跟上面處理過的數字相同了,那么找下來肯定還是重復的。之后就是當 sum 等于 target 的時候了,在將四個數字加入結果 res 之后,left 和 right 都需要去重復處理,分別像各自的方面遍歷即可,參見代碼如下:

解法二:

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

關于“C++怎么實現四數之和”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++怎么實現四數之和”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

贺兰县| 岗巴县| 泗阳县| 腾冲县| 固原市| 措勤县| 三明市| 应用必备| 浪卡子县| 绍兴县| 渝中区| 福鼎市| 合川市| 舟曲县| 鞍山市| 定远县| 建阳市| 偃师市| 莒南县| 益阳市| 惠州市| 沁阳市| 泸州市| 于都县| 广宗县| 扎鲁特旗| 山西省| 陈巴尔虎旗| 临猗县| 馆陶县| 河北区| 黄石市| 中阳县| 六盘水市| 临沂市| 镇沅| 长垣县| 中超| 红安县| 曲松县| 山西省|