← 返回笔记列表

两数之和

2026-03-31
算法C语言
这个题基本上有两种思路, 一种是双指针法,因为我们只return一组解,前提是需要把这个数组排序从小到大,才能使用双指针,当左右指针相等时停止,也就是左指针从左往右走的时候这个和小于我要的值,右指针从右往左走是大于我要的值,这样逐渐减小差距最后等于的时候求出来对应的值,走的时候只能走一个指针,另一个指针停下,因为你不停下的话,原本指针对应的这个数取不到,接下来我的代码就就不用标准的注释格式了,直接添加中文,使用时把中文删了就好 /** * Note: The returned array must be malloced, assume caller calls free(). */ #include typedef struct { int val; int index; } Element; 创建了数组的结构体也就是值和索引 int cmp(const void*a, const void*b){ return((Element*)a)->val-((Element*)b)->val; }这里因为要排序我们写一个比较函数,因为我们需要使用数组里面的值,所以需要把形参强制转化为结构体的格式,然后通过做差来比较大小 int* twoSum(int* nums, int numsSize, int target, int* returnSize) { Element* elements=(Element*)malloc(numsSize*sizeof(Element)); for (int i = 0; i< numsSize;i++){ elements[i].val=nums[i]; elements[i].index=i; }这里因为我们用的是c语言不是cpp(我不会cpp,只是个小菜鸡)所以没法使用vector容器,只能malloc动态分配成数组 qsort(elements,numsSize,sizeof(Element),cmp);这里是需要提前声明用了stdlib内置的qsort比较,也就是第一个是要比较的首地址,然后是元素个数,格式,后面按我们之前cmp的比较顺序排序 int left = 0 ,right = numsSize -1; int* result = (int*)malloc(2*sizeof(int)); *returnSize = 2; while(left int sum = elements[left].val+elements[right].val; if(sum == target){ result[0]=elements[left].index; result[1]=elements[right].index; break; }else if(sumkey == complement) { result[0] = curr->index; result[1] = i; // 释放所有内存 for (int j = 0; j < size; j++) { Node *p = buckets[j]; while (p) { Node *tmp = p; p = p->next; free(tmp); } } free(buckets); return result; } curr = curr->next; } // 未找到,将当前元素插入哈希表,建立值,以及索引对应,以及 h = hash(nums[i], size); Node *newNode = (Node*)malloc(sizeof(Node)); newNode->key = nums[i]; newNode->index = i; newNode->next = buckets[h]; buckets[h] = newNode; } // 理论上不会走到这里,因为题目保证有解 free(buckets); return result; }