leetcode-1. 兩數之和,
給定一個整數陣列 nums,和一個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,并回傳他們的陣列下標,
你可以假設每種輸入只會對應一個答案,但是,陣列中同一個元素不能使用兩遍,
示例:
給定 nums = [2, 7, 11, 15], target = 9,
因為 nums[0] + nums[1] = 2 + 7 = 9,
所以回傳 [0, 1],
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problemset/all/
著作權歸領扣網路所有,商業轉載請聯系官方授權,非商業轉載請注明出處,
int *twoSum( int *nums, int numsSize, int target, int *returnSize ) {
int *answer = NULL;
returnSize[0] = 0;
answer = malloc( sizeof(*answer) * 2 );
for( int i = 0; i < numsSize; ++i ) {
for( int j = i + 1; j < numsSize; ++j ) {
if( target - nums[i] == nums[j] ) {
answer[returnSize[0]++] = i;
answer[returnSize[0]++] = j;
break;
}
}
}
return answer;
}
// 封裝 uthash 開始.
#define ERROR_EXIT( expression ) \
if( (expression) ) exit( EXIT_FAILURE )
typedef void ( TraversalHashTableFunc )( int key, int value );
typedef struct NodeHashTable {
int k;
int v;
UT_hash_handle hh;
} NodeHashTable, HashTable;
// 功能: 創建一個新的哈希表.
// 引數: 無.
// 回傳: NULL.
// 注意: uthash里的新表應該初始為NULL.
HashTable *newHashTable( void ) {
return NULL;
}
// 功能: 將鍵值對加入到哈希表中.
// 引數: ht(存放哈希表物件的指標的指標), key(鍵), value(值).
// 回傳: 無.
// 注意: 當 ht 為NULL 時, 將錯誤退出程式, 當鍵存在時,則更新鍵值為value.
void putHashTable( HashTable **ht, int key, int value ) {
NodeHashTable *n = NULL;
ERROR_EXIT( ht == NULL );
HASH_FIND_INT( *ht, &key, n );
if( n == NULL ) {
n = malloc( sizeof(*n) );
n->k = key;
HASH_ADD_INT( *ht, k, n );
}
n->v = value;
}
// 功能: 將鍵值對從哈希表中移除.
// 引數: ht(存放哈希表物件的指標的指標), key(鍵).
// 回傳: 被移除的鍵值.
// 注意: 當 ht 為NULL 或 鍵不存在 時, 將錯誤退出程式.
int removeHashTable( HashTable **ht, int key ) {
int value = https://www.cnblogs.com/hujunxiang98/p/0;
NodeHashTable *n = NULL;
ERROR_EXIT( ht == NULL );
HASH_FIND_INT( *ht, &key, n );
ERROR_EXIT( n == NULL );
HASH_DEL( *ht, n );
value = n->v;
free( n );
return value;
}
// 功能: 哈希表中是否包含了指定鍵.
// 引數: ht(哈希表物件的指標), key(鍵).
// 回傳: 表中包含了指定鍵回傳1, 否則回傳0.
// 注意: 無.
int existHashTable( HashTable *ht, int key ) {
NodeHashTable *n = NULL;
HASH_FIND_INT( ht, &key, n );
return n != NULL;
}
// 功能: 將鍵值對從哈希表中移除.
// 引數: ht(哈希表物件的指標), key(鍵).
// 回傳: 鍵對應的鍵值.
// 注意: 當 鍵不存在 時, 將錯誤退出程式.
int getHashTable( HashTable *ht, int key ) {
NodeHashTable *n = NULL;
HASH_FIND_INT( ht, &key, n );
ERROR_EXIT( n == NULL );
return n->v;
}
// 功能: 得到哈希表實際已使用大小.
// 引數: ht(哈希表物件的指標).
// 回傳: 哈希表實際已使用大小.
// 注意: 無.
int sizeHashTable( HashTable *ht ) {
return HASH_COUNT( ht );
}
// 功能: 判斷是否為空哈希表.
// 引數: ht(哈希表物件的指標).
// 回傳: 是空表回傳1, 否則回傳0.
// 注意: 無.
int emptyHashTable( HashTable *ht ) {
return HASH_COUNT( ht ) < 1;
}
// 功能: 判斷是否為滿哈希表.
// 引數: ht(哈希表物件的指標).
// 回傳: 0.
// 注意: uthash實作為鏈式存盤,理論上容量是無限制的.
int fullHashTable( HashTable *ht ) {
return 0;
}
// 功能: 遍歷哈希表.
// 引數: ht(哈希表物件的指標), func(用戶自定義函式的指標).
// 回傳: 無.
// 注意: 當 func 為NULL 時, 將錯誤退出程式, 在迭代遍歷程序中每次都把鍵值對傳給func.
void traversalHashTable( HashTable *ht, TraversalHashTableFunc *func ) {
ERROR_EXIT( func == NULL );
for( NodeHashTable *n = ht; n != NULL; n = n->hh.next ) {
func( n->k, n->v );
}
}
// 功能: 清空哈希表.
// 引數: ht(存放哈希表物件的指標的指標), func(用戶自定義函式的指標).
// 回傳: 無.
// 注意: 當 ht 為NULL 時, 將錯誤退出程式, 當 func 不為 NULL 時,在移除每對鍵值對之前把鍵值對傳給func.
void clearHashTable( HashTable **ht, TraversalHashTableFunc *func ) {
NodeHashTable *c = NULL, *t = NULL;
ERROR_EXIT( ht == NULL );
HASH_ITER( hh, *ht, c, t ) {
HASH_DEL( *ht, c );
if( func ) {
func( c->k, c->v );
}
free( c );
}
}
// 功能: 銷毀哈希表.
// 引數: ht(存放哈希表物件的指標的指標), func(用戶自定義函式的指標).
// 回傳: 無.
// 注意: 當 ht 為NULL 時, 將錯誤退出程式, 當 func 不為 NULL 時,在移除每對鍵值對之前把鍵值對傳給func.
void delHashTable( HashTable **ht, TraversalHashTableFunc *func ) {
NodeHashTable *c = NULL, *t = NULL;
ERROR_EXIT( ht == NULL );
HASH_ITER( hh, *ht, c, t ) {
HASH_DEL( *ht, c );
if( func ) {
func( c->k, c->v );
}
free( c );
}
}
// 封裝 uthash 結束.
int *twoSum( int *nums, int numsSize, int target, int *returnSize ) {
int *answer = NULL;
HashTable *ht = newHashTable();
returnSize[0] = 0;
answer = malloc( sizeof(*answer) * 2 );
for( int i = 0; i < numsSize; ++i ) {
putHashTable( &ht, nums[i], i );
}
for( int i = 0; i < numsSize; ++i ) {
int j = target - nums[i];
if( existHashTable( ht, j ) && getHashTable( ht, j ) != i ) {
answer[returnSize[0]++] = i;
answer[returnSize[0]++] = getHashTable( ht, j );
break;
}
}
delHashTable( &ht, NULL );
return answer;
}
// 封裝 uthash 開始.
#define ERROR_EXIT( expression ) \
if( (expression) ) exit( EXIT_FAILURE )
typedef void ( TraversalHashTableFunc )( int key, int value );
typedef struct NodeHashTable {
int k;
int v;
UT_hash_handle hh;
} NodeHashTable, HashTable;
// 功能: 創建一個新的哈希表.
// 引數: 無.
// 回傳: NULL.
// 注意: uthash里的新表應該初始為NULL.
HashTable *newHashTable( void ) {
return NULL;
}
// 功能: 將鍵值對加入到哈希表中.
// 引數: ht(存放哈希表物件的指標的指標), key(鍵), value(值).
// 回傳: 無.
// 注意: 當 ht 為NULL 時, 將錯誤退出程式, 當鍵存在時,則更新鍵值為value.
void putHashTable( HashTable **ht, int key, int value ) {
NodeHashTable *n = NULL;
ERROR_EXIT( ht == NULL );
HASH_FIND_INT( *ht, &key, n );
if( n == NULL ) {
n = malloc( sizeof(*n) );
n->k = key;
HASH_ADD_INT( *ht, k, n );
}
n->v = value;
}
// 功能: 將鍵值對從哈希表中移除.
// 引數: ht(存放哈希表物件的指標的指標), key(鍵).
// 回傳: 被移除的鍵值.
// 注意: 當 ht 為NULL 或 鍵不存在 時, 將錯誤退出程式.
int removeHashTable( HashTable **ht, int key ) {
int value = https://www.cnblogs.com/hujunxiang98/p/0;
NodeHashTable *n = NULL;
ERROR_EXIT( ht == NULL );
HASH_FIND_INT( *ht, &key, n );
ERROR_EXIT( n == NULL );
HASH_DEL( *ht, n );
value = n->v;
free( n );
return value;
}
// 功能: 哈希表中是否包含了指定鍵.
// 引數: ht(哈希表物件的指標), key(鍵).
// 回傳: 表中包含了指定鍵回傳1, 否則回傳0.
// 注意: 無.
int existHashTable( HashTable *ht, int key ) {
NodeHashTable *n = NULL;
HASH_FIND_INT( ht, &key, n );
return n != NULL;
}
// 功能: 將鍵值對從哈希表中移除.
// 引數: ht(哈希表物件的指標), key(鍵).
// 回傳: 鍵對應的鍵值.
// 注意: 當 鍵不存在 時, 將錯誤退出程式.
int getHashTable( HashTable *ht, int key ) {
NodeHashTable *n = NULL;
HASH_FIND_INT( ht, &key, n );
ERROR_EXIT( n == NULL );
return n->v;
}
// 功能: 得到哈希表實際已使用大小.
// 引數: ht(哈希表物件的指標).
// 回傳: 哈希表實際已使用大小.
// 注意: 無.
int sizeHashTable( HashTable *ht ) {
return HASH_COUNT( ht );
}
// 功能: 判斷是否為空哈希表.
// 引數: ht(哈希表物件的指標).
// 回傳: 是空表回傳1, 否則回傳0.
// 注意: 無.
int emptyHashTable( HashTable *ht ) {
return HASH_COUNT( ht ) < 1;
}
// 功能: 判斷是否為滿哈希表.
// 引數: ht(哈希表物件的指標).
// 回傳: 0.
// 注意: uthash實作為鏈式存盤,理論上容量是無限制的.
int fullHashTable( HashTable *ht ) {
return 0;
}
// 功能: 遍歷哈希表.
// 引數: ht(哈希表物件的指標), func(用戶自定義函式的指標).
// 回傳: 無.
// 注意: 當 func 為NULL 時, 將錯誤退出程式, 在迭代遍歷程序中每次都把鍵值對傳給func.
void traversalHashTable( HashTable *ht, TraversalHashTableFunc *func ) {
ERROR_EXIT( func == NULL );
for( NodeHashTable *n = ht; n != NULL; n = n->hh.next ) {
func( n->k, n->v );
}
}
// 功能: 清空哈希表.
// 引數: ht(存放哈希表物件的指標的指標), func(用戶自定義函式的指標).
// 回傳: 無.
// 注意: 當 ht 為NULL 時, 將錯誤退出程式, 當 func 不為 NULL 時,在移除每對鍵值對之前把鍵值對傳給func.
void clearHashTable( HashTable **ht, TraversalHashTableFunc *func ) {
NodeHashTable *c = NULL, *t = NULL;
ERROR_EXIT( ht == NULL );
HASH_ITER( hh, *ht, c, t ) {
HASH_DEL( *ht, c );
if( func ) {
func( c->k, c->v );
}
free( c );
}
}
// 功能: 銷毀哈希表.
// 引數: ht(存放哈希表物件的指標的指標), func(用戶自定義函式的指標).
// 回傳: 無.
// 注意: 當 ht 為NULL 時, 將錯誤退出程式, 當 func 不為 NULL 時,在移除每對鍵值對之前把鍵值對傳給func.
void delHashTable( HashTable **ht, TraversalHashTableFunc *func ) {
NodeHashTable *c = NULL, *t = NULL;
ERROR_EXIT( ht == NULL );
HASH_ITER( hh, *ht, c, t ) {
HASH_DEL( *ht, c );
if( func ) {
func( c->k, c->v );
}
free( c );
}
}
// 封裝 uthash 結束.
int *twoSum( int *nums, int numsSize, int target, int *returnSize ) {
int *answer = NULL;
HashTable *ht = newHashTable();
returnSize[0] = 0;
answer = malloc( sizeof(*answer) * 2 );
for( int i = 0; i < numsSize; ++i ) {
if( existHashTable( ht, target - nums[i] ) ) {
answer[returnSize[0]++] = getHashTable( ht, target - nums[i] );
answer[returnSize[0]++] = i;
break;
}
putHashTable( &ht, nums[i], i );
}
delHashTable( &ht, NULL );
return answer;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/30670.html
標籤:C
上一篇:堆疊-順序存盤
下一篇:leetcode-2. 兩數相加
