Leetcode第一题:两数之和(C++)
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> results;
vector<std::pair<int, int>> nums_cop_ids;
int left=0, right=nums.size()-1;
for(size_t i=0; i<nums.size(); ++i)
{
std::pair<int, int> nums_cop_id{nums[i],i};
nums_cop_ids.push_back(nums_cop_id);
}
quickSort(left, right, nums_cop_ids);
while(left < right)
{
int sum = nums_cop_ids[left].first + nums_cop_ids[right].first;
if(sum==target)
{
results.push_back(nums_cop_ids[left].second);
results.push_back(nums_cop_ids[right].second);
left ++;
right --;
return results;
}else if(sum < target)
{
left ++;
}
else if(sum > target)
{
right --;
}
}
return results;
}
void quickSort(int left, int right, vector<std::pair<int, int>>& arr)
{
if(left >= right)
return;
int i, j;
std::pair<int, int> base, temp;
i = left, j = right;
base = arr[left];
while (i < j)
{
while (arr[j].first >= base.first && i < j)
j--;
while (arr[i].first <= base.first && i < j)
i++;
if(i < j)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[left] = arr[i];
arr[i] = base;
quickSort(left, i - 1, arr);//递归左边
quickSort(i + 1, right, arr);//递归右边
}
};