题目:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].就是输出和为target的两个数的下标,有两个方案,一个是用HashMap,直接标记某个数是否存在,但是考虑到如果元素值很大,不能开那么大的数组,另一个方案是,对数组排序,二分查找对应的值的位置。我这里列出第二种。
另外遇到一个坑,单例测试都是对的,但是Run就WA了,报的错误有误导。后来发现是没有考虑连续输入,需要每次初始化。
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
class Solution {
public:
void quickSort(vector<int>& s, int l, int r, vector<int>&id)
{
if (l < r)
{
int i = l, j = r, temp = s[l], tempid = id[l];
while (i < j)
{
while (i < j && s[j] >= temp) // 从右向左找第一个小于x的数
j--;
if (i < j)
{
id[i] = id[j];
s[i++] = s[j];
}
while (i < j && s[i]< temp) // 从左向右找第一个大于等于x的数
i++;
if (i < j)
{
id[j] = id[i];
s[j--] = s[i];
}
}
s[i] = temp;
id[i] = tempid;
quickSort(s, l, i - 1, id); // 递归调用
quickSort(s, i + 1, r, id);
}
}
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans(0);
vector<int> id(0);
for (int i = 0; i < nums.size(); i++)
id.push_back(i);
quickSort(nums, 0, nums.size() - 1, id);
for (int i = 0; i < nums.size(); i++)
{
int needFind = target - nums[i];
int index = BinarySearch(needFind, 0, nums.size() - 1, nums, id, i);
if (index != -1)
{
ans.push_back(id[i]);
ans.push_back(index);
return ans;
}
}
}
int BinarySearch(int needFind, int left, int right, vector<int>& nums, vector<int>& id, int index) {
while (left < right)
{
int mid = (left + right) / 2;
if (needFind == nums[mid])
{
if (id[index] != id[mid])
return id[mid];
else
if (nums[mid + 1] == nums[mid])
return id[mid + 1];
else return id[mid - 1];
}
if (needFind < nums[mid])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
if (nums[left] == needFind) return id[left];
else return -1;
}
};
int main()
{
Solution *s = new Solution();
vector<int> v;
v.push_back(3);
v.push_back(2);
v.push_back(3);
vector<int> ans = s->twoSum(v, 6);
cout << ans[0] <<" " << ans[1];
getchar();
}

本文介绍了一种解决两数之和问题的有效算法,该算法通过排序和二分查找来寻找数组中两个数相加等于特定目标值的下标。文章详细展示了使用快速排序对数组进行排序的方法,并通过二分查找找到匹配数值的过程。

574

被折叠的 条评论
为什么被折叠?



