电面:给一个数组找出和为k的两个数
2016-04-10 01:49
495 查看
如标题所述,其实LeetCode上也有道差不多的题,Two Sum返回这两个数的对应下标。
那我就按LeetCode上那道题来写吧。
先用双指针的方法嘛,不过LeetCode上面是要求返回下标,那么就不能用sort直接对原本的数组进行排序,会影响之前本来的下标。所以得先复制一个数组出来。
双指针没什么好说的,因为已经排好序了,一个从最左端走,一个从最右端走。写这个主要是为学习一下C中的qsort排序。
Two Sum C代码:
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。
16 / 16 test cases passed.
Status: Accepted
Runtime: 16 ms
那我就按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
相关文章推荐
- Mootools 1.2教程 定时器和哈希简介
- C#获取哈希加密生成随机安全码的类实例
- C#计算字符串哈希值(MD5、SHA)的方法小结
- PowerShell中定义哈希散列(Hash)和调用例子
- PHP中创建和验证哈希的简单方法实探
- Perl 哈希的创建和引用介绍
- Perl 哈希Hash用法之入门教程
- perl哈希hash的常见用法介绍
- perl哈希的一个实例分析
- Go语言常见哈希函数的使用
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum