哈希表使用 O(N) 空间复杂度存储数据,并且以 O(1) 时间复杂度求解问题。
1. 数组中两个数的和为给定值
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
map = {} # 新建一个字典存放nums和其索引
for index, num in enumerate(nums):
num1 = target - num
if num1 in map: # 如果其差值在map中,说明找到了
return [map[num1], index] # 返回这两个数的索引
map[num] = index # 将键值对num,index存到map中,避免在判断时num和num1相同
return None
2. 判断数组是否含有重复元素
给定一个整数数组,判断是否存在重复元素。
如果任意一值在数组中出现至少两次,函数返回 true
。如果数组中每个元素都不相同,则返回 false
。
def containsDuplicate(self, nums: List[int]) -> bool:
return len(set(nums)) != len(nums)
3. 最长和谐序列
和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。
现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。
输入: [1,3,2,2,5,2,3,7]
输出: 5
原因: 最长的和谐数组是:[3,2,2,2,3].
和谐序列中最大数和最小数之差正好为 1,应该注意的是序列的元素不一定是数组的连续元素。
class Solution:
def findLHS(self, nums: List[int]) -> int:
hashmap = {}
for num in nums:
hashmap[num] = hashmap.get(num, 0) + 1
longest = 0
for num in hashmap.keys():
if num + 1 in hashmap:
longest = max(longest, hashmap[num + 1] + hashmap[num])
return longest
4. 最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
longest_streak = 0
num_set = set(nums)
for num in num_set:
if num - 1 not in num_set:
current_num = num
current_streak = 1
while current_num + 1 in num_set:
current_num += 1
current_streak += 1
longest_streak = max(longest_streak, current_streak)
return longest_streak