力扣刷题-热题100题-第1题(C#、python)
1. 两数之和 – 力扣(LeetCode)https://leetcode.cn/problems/two-sum/description/?envType=study-plan-v2&envId=top-100-liked
malloc(sizeof(int)); //malloc()函数的功能是:向内存申请一块连续可用的int类型大小的空间,并返回指向块开头的指针
int *p = &a; // p 是指向 int 类型的指针, 它保存了变量 a 的地址
暴力枚举(时间O(n^2),空间O(1))
双层循环遍历整个数组直至找到
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;
}
哈希法(时间O(n),空间O(n))
两数之和(LeetCode)——哈希表法(C语言)_两数之和哈希c-CSDN博客https://blog.csdn.net/m0_63988748/article/details/125151472?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522cbe81975dfffc5c61604a4f455fdd359%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=cbe81975dfffc5c61604a4f455fdd359&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-125151472-null-null.142^v101^pc_search_result_base8&utm_term=hashTable*%20find&spm=1018.2226.3001.4187
hh: 可以将其理解为固定参数
hashTable: 最开始初始化的哈希表指针
key: 自定义的结构体中的key
sizeof(struct HashTable *) : 计算哈希结构体大小即一个键值对的大小
hash: 新创建的键值对,将其加入hashTable中
hh是内部使用的hash处理句柄,在使用过程中,只需要在结构体中定义一个UT_hash_handle类型的变量即可,不需要为该句柄变量赋值,但必须在该结构体中定义该变量。
Uthash所实现的hash表中,可以通过结构体成员hh的hh.prev和hh.next获取当前节点的上一个节点和下一个节点
哈希表就是输入x得到想要的y,且这个x与y一一对应。这一题就是输入相减得到的数然后得到想要的下标,这个数值与下标就相当于哈希表中的每一对元素,然后用一个循环进行整个数组的遍历,用目标值减去当前值在哈希表中寻找,如果哈希表中有就返回对应的下标,没有就往哈希表里添加这个元素
⌈C⌋哈希表UT_hash_handle——如何将结构体类型作为key_ut hash handle-CSDN博客https://blog.csdn.net/Dusong_/article/details/128757067?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522724b9d70a9a89e6f4aae6c697e05d513%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=724b9d70a9a89e6f4aae6c697e05d513&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-128757067-null-null.142^v101^pc_search_result_base8&utm_term=UT_hash_handle&spm=1018.2226.3001.4187
struct HashTable
{
int key; /*数值作为key*/
int value; /*数的下标作为value*/
UT_hash_handle hh;
};
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
struct HashTable* hash = NULL; /*创建哈希表指针*/
int* res = (int*)malloc(sizeof(int) * 2);
*returnSize = 2;
for (int i = 0; i < numsSize; i++)
{ /*遍历整个数组*/
struct HashTable* ret = NULL; /*接收查找后的返回值*/
int key = target - nums[i];
HASH_FIND_INT(hash, &key, ret); /*在哈希表中查找target - nums[i]*/
//如果没有查找到,则将nums[i]作为key加入哈希表中
if (ret == NULL)
{
struct HashTable* num = (struct HashTable*)malloc(sizeof(struct HashTable));
num->key = nums[i];
num->value = i;
HASH_ADD_INT(hash, key, num);
//如果找到,则找到这两个数
}
else
{
res[0] = ret->value;
res[1] = i;
return res;
}
}
return NULL;
}
python
python enumerate用法总结_enumerate python用法-CSDN博客 例如对于一个seq,得到:
(0, seq[0]), (1, seq[1]), (2, seq[2])
1
enumerate()返回的是一个enumerate对象,例如:
#暴力枚举
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
for i in range(n):
for j in range(i + 1, n):
if nums[i] + nums[j] == target:
return [i, j]
return []
#哈希法
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = dict()
for i, num in enumerate(nums):
if target - num in hashtable:
return [hashtable[target - num], i]
hashtable[nums[i]] = i
return []
作者:weixin_44505472