C++實(shí)現(xiàn)LeetCode(18.四數(shù)之和)
[LeetCode] 18. 4Sum 四數(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ù)項(xiàng),我們使用了 STL 中的 TreeSet,其特點(diǎn)是不能有重復(fù),如果新加入的數(shù)在 TreeSet 中原本就存在的話(huà),插入操作就會(huì)失敗,這樣能很好的避免的重復(fù)項(xiàng)的存在。此題的 O(n^3) 解法的思路跟 3Sum 基本沒(méi)啥區(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 來(lái)進(jìn)行去重復(fù)的處理還是有些取巧,可能在 Java 中就不能這么做,那么還是來(lái)看一種比較正統(tǒng)的做法吧,手動(dòng)進(jìn)行去重復(fù)處理。主要可以進(jìn)行的有三個(gè)地方,首先在兩個(gè) for 循環(huán)下可以各放一個(gè),因?yàn)橐坏┊?dāng)前的數(shù)字跟上面處理過(guò)的數(shù)字相同了,那么找下來(lái)肯定還是重復(fù)的。之后就是當(dāng) sum 等于 target 的時(shí)候了,在將四個(gè)數(shù)字加入結(jié)果 res 之后,left 和 right 都需要去重復(fù)處理,分別像各自的方面遍歷即可,參見(jiàn)代碼如下:
解法二:
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++實(shí)現(xiàn)LeetCode(18.四數(shù)之和)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)四數(shù)之和內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++實(shí)現(xiàn)LeetCode(26.有序數(shù)組中去除重復(fù)項(xiàng))
- C++實(shí)現(xiàn)LeetCode(88.混合插入有序數(shù)組)
- C++實(shí)現(xiàn)LeetCode(21.混合插入有序鏈表)
- C++實(shí)現(xiàn)LeetCode(20.驗(yàn)證括號(hào))
- C++實(shí)現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn))
- C++實(shí)現(xiàn)LeetCode(17.電話(huà)號(hào)碼的字母組合)
- C++實(shí)現(xiàn)LeetCode(83.移除有序鏈表中的重復(fù)項(xiàng))
相關(guān)文章
C語(yǔ)言超詳細(xì)講解循環(huán)與分支語(yǔ)句基礎(chǔ)
各位小伙伴們,今天給大家?guī)?lái)的是循環(huán)與分支語(yǔ)句,本篇將會(huì)向大家介紹這些語(yǔ)句的格式和使用的基本方法,感興趣的朋友來(lái)看看吧2022-04-04C++關(guān)于類(lèi)結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測(cè)試詳解
這篇文章主要介紹了C++類(lèi)結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測(cè)試,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08C語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn)貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07C語(yǔ)言實(shí)現(xiàn)英文文本詞頻統(tǒng)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)英文文本詞頻統(tǒng)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03聊聊C語(yǔ)言中sizeof運(yùn)算符的一個(gè)陷阱
在C語(yǔ)言中,sizeof()是一個(gè)判斷數(shù)據(jù)類(lèi)型或者表達(dá)式長(zhǎng)度的運(yùn)算符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中sizeof運(yùn)算符的一個(gè)陷阱的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11ros項(xiàng)目調(diào)試:vscode下配置開(kāi)發(fā)ROS項(xiàng)目的詳細(xì)教程
這篇文章主要介紹了ros項(xiàng)目調(diào)試:vscode下配置開(kāi)發(fā)ROS項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08