您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++怎么實現(xiàn)四數(shù)之和的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++怎么實現(xiàn)四數(shù)之和文章都會有所收獲,下面我們一起來看看吧。
Given an array S of n integers, are there elements a, b, c, 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 中關(guān)于數(shù)字之和還有其他幾道,分別是 Two Sum ,3Sum ,3Sum Closest,雖然難度在遞增,但是整體的套路都是一樣的,在這里為了避免重復(fù)項,我們使用了 STL 中的 TreeSet,其特點是不能有重復(fù),如果新加入的數(shù)在 TreeSet 中原本就存在的話,插入操作就會失敗,這樣能很好的避免的重復(fù)項的存在。此題的 O(n^3) 解法的思路跟 3Sum 基本沒啥區(qū)別,就是多加了一層 for 循環(huán),其他的都一樣,代碼如下:
解法一:
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 來進(jìn)行去重復(fù)的處理還是有些取巧,可能在 Java 中就不能這么做,那么還是來看一種比較正統(tǒng)的做法吧,手動進(jìn)行去重復(fù)處理。主要可以進(jìn)行的有三個地方,首先在兩個 for 循環(huán)下可以各放一個,因為一旦當(dāng)前的數(shù)字跟上面處理過的數(shù)字相同了,那么找下來肯定還是重復(fù)的。之后就是當(dāng) sum 等于 target 的時候了,在將四個數(shù)字加入結(jié)果 res 之后,left 和 right 都需要去重復(fù)處理,分別像各自的方面遍歷即可,參見代碼如下:
解法二:
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; } };
關(guān)于“C++怎么實現(xiàn)四數(shù)之和”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“C++怎么實現(xiàn)四數(shù)之和”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。