//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;
}