//method 1: quick sort + Loop //beat 89% void quickSort(vector<int> &nums,int iLeft,int iRight,int *arrIndex){ if(iLeft>=iRight) return; int idxRand = rand()%(iRight-iLeft+1) + iLeft; int idxRand_Index = arrIndex[idxRand]; int iPivot = nums[idxRand]; nums[idxRand] = nums[iLeft]; arrIndex[idxRand] = arrIndex[iLeft]; int iBegin = iLeft; int iEnd = iRight; while(iBegin<iEnd){ while(iBegin<iEnd && nums[iEnd]>=iPivot) iEnd--; nums[iBegin] = nums[iEnd]; arrIndex[iBegin] = arrIndex[iEnd]; while(iBegin<iEnd && nums[iBegin]<=iPivot) iBegin++; nums[iEnd] = nums[iBegin]; arrIndex[iEnd] = arrIndex[iBegin]; } nums[iBegin] = iPivot; arrIndex[iBegin] = idxRand_Index; quickSort(nums,iLeft,iBegin-1,arrIndex); quickSort(nums,iBegin+1,iRight,arrIndex); } vector<int> twoSum(vector<int>& nums, int target) { vector<int> retArr; //sort int *arrIndex = (int *)malloc(sizeof(int)*nums.size()); for(int iLoop=0;iLoop<nums.size();iLoop++){ arrIndex[iLoop]=iLoop; } quickSort(nums,0,nums.size()-1,arrIndex); //search int iLeft = 0; int iRight = nums.size()-1; while(iLeft<iRight){ int sum = nums[iLeft]+nums[iRight]; if(sum==target) { retArr.push_back(arrIndex[iLeft]+1); retArr.push_back(arrIndex[iRight]+1); break; } else if(sum<target) iLeft++; else //sum>target iRight--; } free(arrIndex); sort(retArr.begin(),retArr.end()); return retArr; } //method 2: use std::map<int,int> //beat 25% vector<int> twoSum1(vector<int>& nums, int target) { map<int,int> m; vector<int> retVec; for(int iLoop = 0;iLoop < nums.size();iLoop++){ auto itr= m.find(target-nums[iLoop]); if(itr==m.end()){ m[nums[iLoop]] = iLoop; } else { retVec.push_back(itr->second+1); retVec.push_back(iLoop+1); break; } } return retVec; }