一.两个for循环(暴力)
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++:
unordered_map容器:无序map容器
成员方法:
find(key):查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代 器;反之,则返回一个指向容器中最后一个键值对之后位置的
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); ++i)
{
auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end())
{
return {it->second, i};
}
hashtable[nums[i]] = i;
}
return {};
}
};
C:
哈希表hashtable (key,value) :把Key通过哈希函数转换成一个整型数字,将value存储在以该数字为下标的数组空间里。(val下标,key值)
uthash是C的开源代码,实现了常见的hash操作函数,例如查找、插入、删除等。该套开源代码采用宏的方式实现hash函数的相关功能,支持C语言的任意数据结构作为key值(可以是自定义的struct或基本数据类型),甚至可以采用多个值作为key,需要注意的是对于不同类型的key值,hash函数声明略有不同
宏定义:一些命令组织在一起,作为一个单独命令完成一个特定任务
头文件:#include "uthash.h"
常见的hash函数:
①查找元素
HASH_FIND_INT( users, &user_id, s );
users:待查询的hash表
user_id:要查的key值
s:表示该函数的输出值,即我们根据user_id查到的键值对;它是一个指向哈希表
users中一个键值对的指针。因此在调用该函数前,要先定义s
②插入元素
HASH_ADD_INT( users, id, s );
users:待插入的hash表;
id:自定义的键值对结构体struct my_struct中,key域的变量名;即下面struct中的
“id”;注意这里只把变量名输入即可,不需要带入值。
s:待插入的键值对结构体,是指针形式。它的key和value都要给定了
//创建键值对结构
struct hashTable
{
int key;
int val;
UT_hash_handle hh; //一定要有。hh是内部使用的hash处理句柄,不需要赋值,但必须定义
};
//初始化哈希表
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;
}