两数之和
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;
}