例题解析
作者:力扣官方题解 链接:力扣 来源:力扣(LeetCode)
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
提示:
-
2 <= nums.length <= 104
-
-109 <= nums[i] <= 109
-
-109 <= target <= 109
-
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2)
的算法吗?
力扣官方解答:
查找表法:在遍历的同时,记录一些信息,以省去一层循环。
0 | 1 | 2 | 3 | 4 | ||
---|---|---|---|---|---|---|
nums | 6 | 3 | 8 | 2 | 1 | target |
此时找到6,6不在map中,存入。
map | key | 6 | ||||
value | 0 |
此时找到3,target-nums[i]=5,5不在map中,将其存入。
map | key | 6 | 5 | |||
value | 0 | 1 |
此时找到8,target-num[i]=0,0不在map中,存入。
map | key | 6 | 5 | 8 | ||
value | 0 | 1 | 2 |
此时找到2,target-num[i]=6,6在map中。6为我们要寻找的。
map | key | 6 | 5 | 8 | ||
value | 0 | 1 | 2 |
java解法
class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> hashMap = new HashMap<Integer,Integer>(); for(int i = 0;i<nums.length ;i++){ if (hashMap.containsKey(target-nums[i])){ return new int [] { hashMap.get(target - nums[i]), i}; } hashMap.put(nums[i],i); } return new int[0]; } }
c++解法
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语言解法
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; }
UT_hash_handle hh;
是一个特殊的成员变量,它是来自于 uthash
库的一部分,用于管理哈希表的内部结构。将 hh
成员变量包含在结构体中是为了支持使用 uthash
宏操作哈希表。
uthash
是一个在 C 语言中实现的高效哈希表的库,它提供了一组宏来操作哈希表。这些宏通过让用户在结构体中包含特定的成员变量来实现。其中 UT_hash_handle
是一个表示哈希表句柄的特殊结构体成员。UT_hash_handle hh是一个哈希表句柄(hash table handle)是一种用于管理哈希表的数据结构或指针。它允许用户通过句柄访问和操作哈希表的不同部分,例如插入、删除、查找等操作。