C语言
LeetCode题目一:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
①使用C语言的暴力枚举法:
int* twoSum(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* ret = malloc(sizeof(int) * 2);
ret[0] = i, ret[1] = j;
*returnSize = 2;
return ret;
}
}
}
*returnSize = 0;
return NULL;
}
②使用C语言的第二种算法(哈希表法):
struct hashTable {
int key;
int val;
UT_hash_handle hh;
};
struct hashTable* hashtable;
struct hashTable* find(int ikey) {
struct hashTable* tmp;
HASH_FIND_INT(hashtable, &ikey, tmp);
return tmp;
}
void insert(int ikey, int ival) {
struct hashTable* it = find(ikey);
if (it == NULL) {
struct hashTable* tmp = malloc(sizeof(struct hashTable));
tmp->key = ikey, tmp->val = ival;
HASH_ADD_INT(hashtable, key, tmp);
} else {
it->val = ival;
}
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
hashtable = NULL;
for (int i = 0; i < numsSize; i++) {
struct hashTable* it = find(target - nums[i]);
if (it != NULL) {
int* ret = malloc(sizeof(int) * 2);
ret[0] = it->val, ret[1] = i;
*returnSize = 2;
return ret;
}
insert(nums[i], i);
}
*returnSize = 0;
return NULL;
}
个人的一些见解
- 关于哈希表的原理就是一个数组中的数据有其值以及序号,哈希表相当于一个平台,将每一个用到的数据的值以及序号放进去,以便后续提取使用。
- 关于C语言的指针
我需要先解释他的概念我喜欢叫他“纸皮贞”。其实是一个很矫情的人,表面看是“p”,内心确是一片“d(地址)”,好看也好看,好用也好用,但是用之前需要声明----我要用它了!并且还很滑头,你得变着花样用
“纸皮贞”内心表示“d(地址)”,但它头上加个“*”箍咒就厉害了,就可以表示数据的值。
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
“NULL”是“纸皮贞”最特殊的一类,它是最纯洁的一个人,内心十分干净,空白!!!他心里的“d”真的是一片白月光----为0。
- 关于结构体 就下次在分解
注:解题方法为搬运的代码,新人小白,不喜勿喷。