3Sum

xiaoxiao2021-02-28  40

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets. For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ] class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(),nums.end()); int n=nums.size(); vector<vector<int>> res; for(int i=0;i<n-2;i++){ if(i>0 && (nums[i]==nums[i-1]) )continue; int l=i+1, r= n-1; while(l<r){ int sum =nums[i]+nums[l]+nums[r]; if(sum<0) l++; else if(sum>0)r--; else { res.push_back(vector<int>{nums[i],nums[l],nums[r]}); while(l+1<r && nums[l]==nums[l+1])l++; while(l<r-1 && nums[r]==nums[r-1]) r--; l++; r--; } } } return res; //time is out!(the following is mine) // int length = nums.size(); // vector<vector<int>> ret; // for(int i=0;i<length;i++){ // for(int j=i+1;j<length;j++){ // for(int k=j+1;k<length;k++){ // if(nums[i] + nums[j] + nums[k] == 0){ // ret.push_back({nums[i],nums[j],nums[k]}); // } // } // } // } // vector<int> index; // length = ret.size(); // for(int i=0;i<length;i++){ // for(int j=i+1;j<length;j++){ // // cout << checkSame(ret[i],ret[j]) << endl; // if(checkSame(ret[i],ret[j])){ // // // index.push_back(i); // ret[j] = {-1,-1,-1}; // } // } // } // // for(int i=0;i<index.size();i++){ // // ret[index[i]] = {-1,-1,-1}; // // } // for(vector<vector<int>>::iterator it = ret.begin();it!=ret.end();){ // // cout << (*it)[0] << (*it)[1] <<(*it)[2] <<endl; // if((*it)[0] == 0 && (*it)[1] == 0 && (*it)[2] == 0){ // it++; // continue; // } // if((*it)[0] == (*it)[1] && (*it)[1] == (*it)[2]){ // it = ret.erase(it); // } // else{ // it++; // } // } // // ret.erase({-1,-1,-1}); // return ret; } bool checkSame(vector<int>& a,vector<int>& b){ int al = a.size(); int bl = b.size(); if(al != bl){ return false; } sort(a.begin(),a.end()); sort(b.begin(),b.end()); // cout << "a: " << a[0] << a[1] << a[2] << endl; // cout << "b: " << b[0] << b[1] << b[2] << endl; for(int i=0;i<al;i++){ if(a[i] != b[i]){ return false; } } return true; } // void sort(vector<int>& v){ // int len = v.size(); // for(int i=0;i<len;i++){ // for(int j=0;j<len-i-1;j++){ // if(v[j] > v[j+1]){ // int t = v[j]; // v[j] = v[j+1]; // v[j+1] = t; // } // } // } // } };

转载请注明原文地址: https://www.6miu.com/read-2625291.html

最新回复(0)