两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法一:
其实效率已经挺高了
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> m;
for (vector<int>::iterator iter=nums.begin(); iter!=nums.end(); ++iter) {
if (m.find(target -*iter)!=m.end()) {
return {iter-nums.begin(), m[target - *iter]};
}
m[*iter] = iter-nums.begin();
}
return {};
}
解法二:
给出更高效率的
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> arr(nums);
sort(arr.begin(), arr.end());
int i = 0, j = arr.size() - 1;
while (i < j)
{
if (arr[i] + arr[j] < target)
i++;
else if (arr[i] + arr[j] > target)
j--;
else
break;
}
vector<int> ret;
int a = distance(nums.begin(), find(nums.begin(), nums.end(), arr[i]));
reverse(nums.begin(),nums.end());
int b = nums.size() - 1 - distance(nums.begin(), find(nums.begin(), nums.end(), arr[j]));
ret.push_back(a);
ret.push_back(b);
return ret;
}