日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

15.Three Sum

發布時間:2025/4/14 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 15.Three Sum 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
思路
  • 直接暴力,\(O(n^4 log(n))\),不出意外的超時了。。
class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;int i,j,k;int len = nums.size();for(i = 0; i < len; i++){for(j = i+1; j < len; j++){for(k = j+1; k < len; k++){if(nums[i]+nums[j]+nums[k] == 0){vector<int> inRes;inRes.push_back(nums[i]);inRes.push_back(nums[j]);inRes.push_back(nums[k]);bool ok = true;for(int m = 0; m < res.size(); m++){if(issame(inRes,res[m])){ ok = false;continue;}}if(ok) res.push_back(inRes);}}}}return res;}bool issame(vector<int> a,vector<int> b){if(a.size() != b.size()) return false;sort(begin(a),end(a));sort(begin(b),end(b));bool ok = true;for(int i = 0; i < a.size(); i++){if(a[i] != b[i]){ok = false;}}return ok;} };
  • 利用map暴力,時間復雜度 \(O(n^3 log(n))\),依然超時。。
class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;map<int,int> tmp;int i,j,k;int len = nums.size();for(i = 0; i < len; i++){tmp[nums[i]] = i;}for(i = 0; i < len; i++){for(j = i+1; j < len; j++){vector<int> inRes = {};if(tmp.find(-(nums[i]+nums[j])) != tmp.end() && tmp[-(nums[i]+nums[j])] != i && tmp[-(nums[i]+nums[j])] != j){inRes.push_back(nums[i]);inRes.push_back(nums[j]);inRes.push_back(-(nums[i]+nums[j])); bool ok = true;for(int m = 0; m < res.size(); m++){if(issame(inRes,res[m])) ok = false; }if(ok){res.push_back(inRes);}}}}return res; }bool issame(vector<int> a,vector<int> b){if(a.size() != b.size()) return false;sort(begin(a),end(a));sort(begin(b),end(b));bool ok = true;for(int i = 0; i < a.size(); i++){if(a[i] != b[i]){ok = false;}}return ok;} };
  • 利用3個指針,首先固定一個,然后類似于Two Sum問題。(這里是用map存儲返回結果的,需要避免重復的問題,而直接用set存儲就方便許多了),復雜度為 \(O(n^2)\),如果用set的話,復雜度應該是 \(O(n^3)\)
class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {int i,lo,hi;int len = nums.size();sort(nums.begin(), nums.end());vector<vector<int>> res;for(int i = 0; i < len-2; i++){int lo = i+1,hi = len-1;int sum = -nums[i];if(i == 0 || (nums[i] != nums[i-1] && i > 0)){while(lo < hi){if((nums[lo] + nums[hi]) == sum){vector<int> tmp;tmp.push_back(nums[i]);tmp.push_back(nums[lo]);tmp.push_back(nums[hi]);cout << tmp[0] << " " << tmp[1] <<" " << tmp[2] << endl;res.push_back(tmp);while(lo < hi && nums[lo] == nums[lo+1]){lo++;}while(lo < hi && nums[hi] == nums[hi-1]){hi--;}lo++;hi--;}else if ((nums[lo]+nums[hi]) < sum){lo++;}else hi--;}}}return res;} };

轉載于:https://www.cnblogs.com/UniMilky/p/6951664.html

總結

以上是生活随笔為你收集整理的15.Three Sum的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。