剑指 Offer II 006. 排序数组中两个数字之和
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。
假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。
示例 1:
输入:numbers = [1,2,4,6,10], target = 8
输出:[1,3]
解释:2 与 6 之和等于目标数 8 。因此 index1 = 1, index2 = 3 。
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[0,2]
示例 3:
输入:numbers = [-1,0], target = -1
输出:[0,1]
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define size 100
struct hash{
int val;
int index;
struct hash *next;
};
void add_hash( struct hash * h,int val,int index){
struct hash *p=( struct hash *)malloc(sizeof( struct hash ));
p->val=val;
p->index=index;
p->next=h->next;
h->next=p;
}
int find_hash( struct hash *h,int val){
struct hash *p=h->next;
while(p){
if(p->val==val){
return p->index;
}
p=p->next;
}
return -1;
}
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){
struct hash * h[size];
int i;
int *re=(int *)malloc(sizeof(int)*2);
for(i=0;i<size;i++){
h[i]=(struct hash *)malloc(sizeof( struct hash ));
h[i]->next=NULL;
}
for(i=0;i<numbersSize;i++){
add_hash(h[abs(numbers[i])%size],numbers[i],i);
}
for(i=0;i<numbersSize;i++){
if(find_hash(h[abs(target-numbers[i])%size],target-numbers[i])!=-1){
int index=find_hash(h[abs(target-numbers[i])%size],target-numbers[i]);
// printf("index %d",index);
if(index>i){
re[1]=index;
re[0]=i;
}
else{
re[1]=i;
re[0]=index;
}
*returnSize=2;
return re;
}
}
return NULL;
}