mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 06:07:20 +08:00 
			
		
		
		
	Use PascalCase for all structs in C. SImplify n_queens.c Format C code for chapter of graph.
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**
 | 
						|
 * File: two_sum.c
 | 
						|
 * Created Time: 2023-01-19
 | 
						|
 * Author: Reanon (793584285@qq.com)
 | 
						|
 */
 | 
						|
 | 
						|
#include "../utils/common.h"
 | 
						|
 | 
						|
/* 方法一:暴力枚举 */
 | 
						|
int *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {
 | 
						|
    for (int i = 0; i < numsSize; ++i) {
 | 
						|
        for (int j = i + 1; j < numsSize; ++j) {
 | 
						|
            if (nums[i] + nums[j] == target) {
 | 
						|
                int *res = malloc(sizeof(int) * 2);
 | 
						|
                res[0] = i, res[1] = j;
 | 
						|
                *returnSize = 2;
 | 
						|
                return res;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    *returnSize = 0;
 | 
						|
    return NULL;
 | 
						|
}
 | 
						|
 | 
						|
/* 哈希表 */
 | 
						|
typedef struct {
 | 
						|
    int key;
 | 
						|
    int val;
 | 
						|
    UT_hash_handle hh; // 基于 uthash.h 实现
 | 
						|
} HashTable;
 | 
						|
 | 
						|
/* 哈希表查询 */
 | 
						|
HashTable *find(HashTable *h, int key) {
 | 
						|
    HashTable *tmp;
 | 
						|
    HASH_FIND_INT(h, &key, tmp);
 | 
						|
    return tmp;
 | 
						|
}
 | 
						|
 | 
						|
/* 哈希表元素插入 */
 | 
						|
void insert(HashTable *h, int key, int val) {
 | 
						|
    HashTable *t = find(h, key);
 | 
						|
    if (t == NULL) {
 | 
						|
        HashTable *tmp = malloc(sizeof(HashTable));
 | 
						|
        tmp->key = key, tmp->val = val;
 | 
						|
        HASH_ADD_INT(h, key, tmp);
 | 
						|
    } else {
 | 
						|
        t->val = val;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/* 方法二:辅助哈希表 */
 | 
						|
int *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {
 | 
						|
    HashTable *hashtable = NULL;
 | 
						|
    for (int i = 0; i < numsSize; i++) {
 | 
						|
        HashTable *t = find(hashtable, target - nums[i]);
 | 
						|
        if (t != NULL) {
 | 
						|
            int *res = malloc(sizeof(int) * 2);
 | 
						|
            res[0] = t->val, res[1] = i;
 | 
						|
            *returnSize = 2;
 | 
						|
            return res;
 | 
						|
        }
 | 
						|
        insert(hashtable, nums[i], i);
 | 
						|
    }
 | 
						|
    *returnSize = 0;
 | 
						|
    return NULL;
 | 
						|
}
 | 
						|
 | 
						|
/* Driver Code */
 | 
						|
int main() {
 | 
						|
    // ======= Test Case =======
 | 
						|
    int nums[] = {2, 7, 11, 15};
 | 
						|
    int target = 13;
 | 
						|
    // ====== Driver Code ======
 | 
						|
    int returnSize;
 | 
						|
    int *res = twoSumBruteForce(nums, sizeof(nums) / sizeof(int), target, &returnSize);
 | 
						|
    // 方法一
 | 
						|
    printf("方法一 res = ");
 | 
						|
    printArray(res, returnSize);
 | 
						|
 | 
						|
    // 方法二
 | 
						|
    res = twoSumHashTable(nums, sizeof(nums) / sizeof(int), target, &returnSize);
 | 
						|
    printf("方法二 res = ");
 | 
						|
    printArray(res, returnSize);
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 |