C语言
#define VAL(ptr) (*(int *)ptr)
typedef struct ListNodeST {
struct ListNodeST * next;
int s;
int e;
} ListNode;
int comp ( const void * a, const void * b) {
return VAL ( a) - VAL ( b) ;
}
#define MAX_ONE(a,b) (a>b?a:b)
int isExists ( struct ListNodeST * head, int s, int e) {
if ( s > e) {
s ^ = e;
e ^ = s;
s ^ = e;
}
while ( head != NULL ) {
if ( head-> s == s && head-> e == e) {
return 1 ;
}
head = head-> next;
}
return 0 ;
}
#define HASH_SIZE (1<<11)
#define HASH_MASK (HASH_SIZE-1)
int * * threeSum ( int * nums, int numsSize, int * returnSize, int * * returnColumnSizes) {
int i;
int * * ret = NULL ;
int s, e, vi, vs, ve, rsize = 0 ;
int hmapsize = 1 << 3 ;
struct ListNodeST * hmap[ HASH_SIZE] = { NULL } , * tln = NULL ;
* returnSize = 0 ;
ret = calloc ( hmapsize, sizeof ( int * ) ) ;
* returnColumnSizes = calloc ( hmapsize, sizeof ( int ) ) ;
qsort ( nums, numsSize, sizeof ( int ) , comp) ;
for ( i = 0 ; i < numsSize; i++ ) {
s = i+ 1 ;
e = numsSize- 1 ;
while ( s < e) {
vi = nums[ i] ;
vs = nums[ s] ;
ve = nums[ e] ;
if ( ( vi + vs + ve) == 0 ) {
if ( isExists ( hmap[ vi & HASH_MASK] , vs, ve) == 1 ) {
s++ ;
continue ;
}
rsize+ = 1 ;
if ( rsize >= hmapsize) {
hmapsize = hmapsize << 1 ;
ret = realloc ( ret, sizeof ( int * ) * hmapsize) ;
* returnColumnSizes =
realloc ( * returnColumnSizes, sizeof ( int ) * hmapsize) ;
}
ret[ rsize- 1 ] = calloc ( 3 , sizeof ( int ) ) ;
ret[ rsize- 1 ] [ 0 ] = vi;
ret[ rsize- 1 ] [ 1 ] = vs;
ret[ rsize- 1 ] [ 2 ] = ve;
( * returnColumnSizes) [ rsize- 1 ] = 3 ;
tln = calloc ( 1 , sizeof ( * tln) ) ;
if ( vs > ve) {
tln-> s = ve;
tln-> e = vs;
} else {
tln-> s = vs;
tln-> e = ve;
}
tln-> next = hmap[ vi & HASH_MASK] ;
hmap[ vi & HASH_MASK] = tln;
tln = NULL ;
s++ ;
continue ;
}
if ( ( vi + vs + ve) > 0 ) {
e-- ;
continue ;
}
if ( ( vi + vs + ve) < 0 ) {
s++ ;
continue ;
}
}
}
* returnSize = rsize;
return ret;
}
题目
注意点
需要去重,本文去重使用Hash的办法,如代码中hmap; 去重时注意s与e位置的值得大小排序后再进行比较; 找到结果后s,e继续保持遍历,避免漏掉场景; hash表的内存分配注意控制,每个进行分配realloc的代码存在过超时的情况;