leetcode-hot100-hash表
- 1. 两数之和
- 49. 字母异位次分组
- 128. 最长连续序列
hash表主要功能是:记录,当做查找表,时间换空间的一种策略。
1. 两数之和
nums = [2,7,11,15], target = 9
输出:[0,1]
**解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
你可以假设每种输入只会对应一个答案。
第一思路:双层循环,第一层循环 i in [0, N], 第二层循环 j in [i+1, N], 依次计算nums[i] + nums[j],判断是否等于target;如果相等,返回下标i,j;否则继续遍历,直到循环结束,返回[-1, -1]表示不存在这组解。
for i in range(0, N):for j in range(i+1, N):temp = nums[i] + nums[j]if temp == target:return [i, j]return [-1, -1]
存在的问题:时间复杂度过高。
因为是一个查找问题,所以想到用hash表。
如果我们先过一遍数组,将数值和下标的对应关系存储在hash表中。然后再过一遍数组,判断target - nums[i]是否在hash表中,如果在,说明知道了,返回即可;如果没找到,遍历下一个元素。
另外,我们可以将hash表存储和数组遍历合并到一次遍历中。
hash_table = {}for i in range(0, N):if target - nums[i] in hash_table:return [hash_table[target-nums[i]], i]hash_table[nums[i]] = ireturn [-1, -1] # 没找到
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:table = {}for i in range(len(nums)):if target - nums[i] in table:return [table[target-nums[i]], i]table[nums[i]] = ireturn [-1, -1]
49. 字母异位次分组
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: output:[ [“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”] ]
对数组中的每一项进行排序,这样异位词排序后顺序一致,我们可以把顺序一致的字符串合并,遍历结束后返回即可。
hash_table = defaultdict(list)for st in strs:key = "".join(sorted(st))hash_table[key].append(st)return hash_table.values()
异位次的统一化,可以通过数据统计实现,将异位次转换成统计信息,如a:3,表示a出现了3次。
因为是字母,我们可以用26个英文字符进行统计。
128. 最长连续序列
示例 1:
**输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
**输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
采用集合,记录数组中的每个元素;然后查找连续序列,最后再多个连续序列中查找最长序列。
如何查找连续序列?以当前元素为第一个元素,向后查找,如果找到了,继续找连续序列;因为连续序列,所以当前元素-1应该不在hash表或集合中。直到找不到,说明找到了以当前元素为第一个元素的连续序列;然后以下一个元素为起点查找新的序列。
hs = set(nums)longest = 0
for num in nums:if nums-1 not in hs:cur_len = 1cur_num = numswhile cur_num+1 in hs:cur_len += 1cur_num += 1longest = max(longest, cur_len)return longest
class Solution:def longestConsecutive(self, nums: List[int]) -> int:longest_streak = 0num_set = set(nums)for num in num_set:if num - 1 not in num_set:current_num = numcurrent_streak = 1while current_num + 1 in num_set:current_num += 1current_streak += 1longest_streak = max(longest_streak, current_streak)return longest_streakclass Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> hash;for (auto x : nums)hash.insert(x);int longestSteak = 0;for (auto x: hash) {if (!hash.count(x-1)){int curNum = x, curSteak = 1;while (hash.count(curNum+1)) {curNum += 1;curSteak += 1;}longestSteak = max(longestSteak, curSteak);}}return longestSteak;}
};
hash表主要功能是:记录,当做查找表,时间换空间的一种策略。