力扣四数之和
力扣四數(shù)之和
文章目錄
- 力扣四數(shù)之和
- 一、題目描述
- 二、分析
- 三、代碼
- 四、問題描述
- 五、分析
- 六、代碼
- 七、100Sum 問題?
一、題目描述
二、分析
這道題和:三數(shù)之和:三數(shù)之和類似,直接放代碼:
三、代碼
class Solution { public:// 只需要返回三個數(shù)的和,根據(jù)15的雙指針來改int threeSumClosest(vector<int>& nums, int target) {int n = nums.size();if( n < 3 )return NULL;if( n == 3 )return nums[0]+nums[1] + nums[2];// 仍然需要重排sort( nums.begin(), nums.end() );int minMerge = INT_MAX;int ans = 0;int tmpSum = 0;for( int first = 0; first < n; first++ ){int second = first + 1;int third = n - 1;while( second < third ){tmpSum = nums[first] + nums[second] + nums[third];// 如果當(dāng)前距離小于目前最小距離,則需要更新if( abs(tmpSum - target) < minMerge ){ minMerge = abs( tmpSum - target );ans = tmpSum;}// 然后決定下一步怎么走if( tmpSum < target ){ // 首先,tmpSum < target說明右側(cè)可能有更好的結(jié)果,必須是像右側(cè)走,second++second++;}else if (tmpSum > target){third--;}else{ // 如果已經(jīng)相等,那么間隔就是0return ans;}}}return ans;} };四、問題描述
五、分析
原理和三數(shù)之和完全一樣
六、代碼
class Solution{public: vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(),nums.end());vector<vector<int> > res;if(nums.size() < 4)return res;int a,b,c,d,_size=nums.size();for(a = 0;a <= _size - 4;a++){if(a > 0 && nums[a] == nums[a - 1]) continue; //確保nums[a] 改變了for(b = a + 1;b <= _size - 3;b++){if(b > a + 1 && nums[b] == nums[b - 1])continue; //確保nums[b] 改變了c = b + 1,d = _size - 1;while(c < d){if(nums[a] + nums[b] + nums[c] + nums[d] < target)c++;else if(nums[a] + nums[b] + nums[c] + nums[d] > target)d--;else{res.push_back({nums[a],nums[b],nums[c],nums[d]});while(c < d && nums[c + 1] == nums[c]) //確保nums[c] 改變了c++;while(c <d && nums[ d - 1] == nums[d]) //確保nums[d] 改變了d--;c++;d--;}}}}return res;} };七、100Sum 問題?
- 在 LeetCode 上,4Sum 就到頭了,但是回想剛才寫 3Sum 和 4Sum的過程,實際上是遵循相同的模式的。我相信你只要稍微修改一下 4Sum 的函數(shù)就可以復(fù)用并解決 5Sum 問題,然后解決 6Sum問題……
- 那么,如果我讓你求 100Sum 問題,怎么辦呢?其實我們可以觀察上面這些解法,統(tǒng)一出一個 nSum 函數(shù):
- 嗯,看起來很長,實際上就是把之前的題目解法合并起來了,n == 2 時是 twoSum 的雙指針解法,n > 2時就是窮舉第一個數(shù)字,然后遞歸調(diào)用計算 (n-1)Sum,組裝答案。
- 需要注意的是,調(diào)用這個 nSum 函數(shù)之前一定要先給 nums 數(shù)組排序,因為 nSum 是一個遞歸函數(shù),如果在 nSum 函數(shù)里調(diào)用排序函數(shù),那么每次遞歸都會進行沒有必要的排序,效率會非常低。
- 比如說現(xiàn)在我們寫 LeetCode 上的 4Sum 問題:
- 再比如 LeetCode 的 3Sum 問題,找 target == 0 的三元組:
那么,如果讓你計算 100Sum 問題,直接調(diào)用這個函數(shù)就完事兒了。
總結(jié)
- 上一篇: 双指针解决力扣两/三数之和问题
- 下一篇: 史上最详细的MySQL操作事例