力扣刷题-热题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

物联沃分享整理
物联沃-IOTWORD物联网 » 力扣刷题-热题100题-第1题(C#、python)

发表回复