LeetCode-18-4Sum
生活随笔
收集整理的這篇文章主要介紹了
LeetCode-18-4Sum
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、問題描述
給定一個數(shù)組S,和一個int類型的數(shù)target,在S中尋找四個數(shù),這四個數(shù)之和為target。返回一個vector<vector<int>>
例子:S={1, 0, -1, 0, -2, 2},target = 0.返回結(jié)果為{{-1,0,0,1},{-2,1,1,2},{-2,0,0,2}}
二、問題解決
最簡單的思路是四層循環(huán),這樣不管是之前的3之和問題還是4之和問題都能解決,缺點就是比較費時,在leetcode上提交還可能超時。
更好一點的方式是對數(shù)組進行排序之后,從兩邊逼近的方式。這樣可以減少一層循環(huán),3數(shù)之和就先確定一個數(shù),4數(shù)之和就先確定兩個數(shù)。本題下面的解法之中,固定i和j,讓k和l沖兩邊逼近。
這題比較麻煩的是去重復(fù)。
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++) {//去除重復(fù)while (i != 0 && nums.at(i - 1) == nums.at(i))i++;for (int j = i + 1; j < nums.size() - 2; j++) {
//去除重復(fù)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);
//去除重復(fù)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; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/likaiming/p/8280311.html
總結(jié)
以上是生活随笔為你收集整理的LeetCode-18-4Sum的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到猫头鹰和老鹰是什么预兆
- 下一篇: 梦到两个男孩什么预兆