1.两数之和时间2026/3/18题目核心要求小白版给你一串整数存在数组nums里和一个目标数target你要做 3 件事找到数组里两个不同的数加起来刚好等于target返回这两个数在数组里的下标C 语言数组下标从 0 开始数题目保证只有 1 组正确答案不用考虑多解返回顺序不限制哈希表一本超级快的字典字典里的「字」叫键 (key)这里存数组里的数字本身字典里的「解释」叫值 (value)这里存数字对应的数组下标最核心的优势通过「键」找「值」只需要 1 次就能找到不用循环遍历查找时间是O(1)常数级核心思路把「找两个数相加等于 target」转换成找当前数的补数是否已经出现过对当前遍历的数nums[i]计算它的补数complement target - nums[i]补数就是能和当前数加起来等于 target 的数去哈希表里查有没有这个补数有直接返回「补数对应的下标」和「当前下标 i」就是答案没有把当前的数nums[i]和它的下标 i存到哈希表里继续遍历下一个数知识点重点哈希表开始为空所以数组第一个数查找不到再存入哈希表内。最多执行n次。完整代码// uthash必须的头文件LeetCode环境自带无需额外配置 #include uthash.h #include stdlib.h // 1. 定义哈希表结构体固定格式小白直接用 typedef struct { int key; // 键数组里的数字 int val; // 值数字对应的数组下标 UT_hash_handle hh; // uthash固定必须的成员不用修改不用管原理 } HashTable; int* twoSum(int* nums, int numsSize, int target, int* returnSize) { *returnSize 2; int* result (int*)malloc(sizeof(int) * 2); // 2. 定义哈希表头指针必须初始化为NULL否则会出错 HashTable* head NULL; // 3. 只需要一层循环遍历数组1次 for (int i 0; i numsSize; i) { // 4. 计算当前数的补数我们要找的另一个数 int complement target - nums[i]; // 5. 临时指针用来接收哈希表的查找结果 HashTable* tmp NULL; // 6. 去哈希表里查找补数HASH_FIND_INT是uthash的查找宏 // 参数哈希表头、要找的键的地址、接收结果的指针 HASH_FIND_INT(head, complement, tmp); // 7. tmp不为NULL说明找到了补数配对成功 if (tmp ! NULL) { // 8. 补数的下标是tmp-val当前下标是i存入结果 result[0] tmp-val; result[1] i; // 9. 直接返回结果 return result; } // 10. 没找到补数把当前数和下标存入哈希表 // 先给新节点分配内存 HashTable* node (HashTable*)malloc(sizeof(HashTable)); node-key nums[i]; // 键存当前数字 node-val i; // 值存当前下标 // 11. 添加到哈希表HASH_ADD_INT是uthash的添加宏 // 参数哈希表头、结构体里键的字段名、要添加的节点指针 HASH_ADD_INT(head, key, node); } // 题目保证有解这里不会执行仅避免编译警告 return result; } // 【本地测试用main函数】LeetCode提交时不用写 #include stdio.h int main() { // 测试示例3nums[3,3], target6预期输出[0,1] int nums[] {3,3}; int target 6; int numsSize sizeof(nums) / sizeof(nums[0]); int returnSize; int* res twoSum(nums, numsSize, target, returnSize); printf(结果: [%d,%d]\n, res[0], res[1]); free(res); return 0; }代码详解num是数组numssize是数组长度target是目标和returnsize是输出参数用于返回结果数组的长度returnSize指针存的是地址*returnSize通过这个地址找到真正的变量*returnSize 2;把那个变量改成 2sizeof(int) * 2表示要申请 2 个 int 大小的空间也就是能存两个整数。-是通过指针访问结构体成员的运算符HASH_FIND_INT是uthash的查找宏接(表头, 键地址, 节点指针)HASH_ADD_INT是uthash的添加宏接(表头, 键字段名, 节点指针)int* res准备好一个指针用来接住动态分配的结果数组。free(res)用完后把内存还回去防止泄漏。