您的位置:首页 > 职场人生

电面:给一个数组找出和为k的两个数

2016-04-10 01:49 495 查看
如标题所述,其实LeetCode上也有道差不多的题,Two Sum返回这两个数的对应下标。

那我就按LeetCode上那道题来写吧。

先用双指针的方法嘛,不过LeetCode上面是要求返回下标,那么就不能用sort直接对原本的数组进行排序,会影响之前本来的下标。所以得先复制一个数组出来。

双指针没什么好说的,因为已经排好序了,一个从最左端走,一个从最右端走。写这个主要是为学习一下C中的qsort排序。

Two Sum C代码:

typedef struct{
int val;
int idx;
}Node;
int cmp(const void* a,const void* b)
{
return (*(Node*)a).val-(*(Node*)b).val;
}
int* twoSum(int *nums,int numsize,int target)
{
int* res=(int*)malloc(sizeof(int)*2);
if(numsize==0)
{
return res;
}
Node* nodes=(Node*)malloc(sizeof(Node)*numsize);
for(int i=0;i<numsize;i++)
{
nodes[i].val=nums[i];
nodes[i].idx=i;
}
qsort(nodes,numsize,sizeof(Node),cmp);
int low=0,high=numsize-1;
while(low<high)
{
if(nodes[low].val+nodes[high].val==target)
{
if (nodes[low].idx < nodes[high].idx)
{
res[0] = nodes[low].idx;
res[1] = nodes[high].idx;
}
else
{
res[1] = nodes[low].idx;
res[0] = nodes[high].idx;
}
break;
}
else if(nodes[low].val+nodes[high].val<target)
{
low++;
}
else
{
high--;
}
}
return res;
}


16 / 16 test cases passed.

Status: Accepted

Runtime: 4 ms

因为返回下标嘛,所以比较合适的应该是用哈希来做。可以把问题抽象出来。

我们想要知道x+y=target,那么我们可以这样定义函数关系y=target-x,f:A->B。

函数的定义域A是给定的那个数组。值域是A中所有元素的像的集合C。 我们希望找到的y∈S,S是值域集合C与定义域集合A的交集(y∈C ^ y∈A因为是在给定数组中找两个数)。

每次遍历我们都能通过函数关系y=target-x得到一个y,但是我们只找y∈S的。那么如何找S呢?

大致思路是这样的:

对于一个空集合D,当y=target-x得到的y∉D,我们就把x添加到D中,D中相当于全是x,如果y=target-x得到的y∈D,那么y属于S。

vector<int> twoSum(vector<int>& nums, int target) {
int len=nums.size();
vector<int> res;
if(len==0){
return res;
}
unordered_map<int,int> m;
int y;
for(int i=0;i<len;i++){
y=target-nums[i];
if(m.find(y)==m.end()){//m里面没有
m[nums[i]]=i;
}
else{
res.push_back(m[y]);
res.push_back(i);
break;
}
}
return res;
}


16 / 16 test cases passed.

Status: Accepted

Runtime: 16 ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息