找了个leeCode最简单的题做,结果发现要做到O(n)还是好麻烦……
#include <stdio.h> #include <stdlib.h> typedef struct TANode { int pos; struct TANode *next; }TA,*TAP; int* twoSum(int* nums, int numsSize, int target) { int max=nums[0],i,offset,min=nums[0]; for(i=1;i<numsSize;i++) { if(nums[i]>max) max=nums[i]; if(nums[i]<min) min=nums[i]; } if(min<0) min=-min; int *r=(int*)malloc(2*sizeof(int)); TA *ta=(TA *)malloc((max+min+1)*sizeof(TA)); for(i=0;i<(max+min+1);i++) { ta[i].pos=-1; ta[i].next=NULL; } for(i=0;i<numsSize;i++) { if(ta[nums[i]+min].pos==-1) { ta[nums[i]+min].pos=i; } else { TAP t=(TAP)malloc(sizeof(TA)); t->pos=i; t->next=NULL; ta[nums[i]+min].next=t; } } for(i=0;i<numsSize;i++) { int x=nums[i],y; if(target-x+min>=0 && ta[target-x+min].pos != -1) { if(i<ta[target-x+min].pos) { r[0]=i; r[1]=ta[target-x+min].pos; return r; } else if(i>ta[target-x+min].pos) { r[0]=ta[target-x+min].pos; r[1]=i; return r; } else { TAP t=&ta[target-x+min]; if(t->pos==i) { t=t->next; } if(t) { r[0]=i; r[1]=t->pos; return r; } } } } return r; } void printA(int *a,int len) { for(int i=0;i<len;i++) { printf("%d ",a[i]); } } void main() { int nums[3]={3,3,6}; int *r=twoSum(nums,3,6); printA(r,2); getchar(); }