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

如标题所述,其实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;isizeof(Node),cmp);
    int low=0,high=numsize-1;
    while(lowif(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].valelse
        {
            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;iif(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

你可能感兴趣的:(哈希)