leetcode-hot100-hash表

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]] = i

return [-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]] = i
        
        return [-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 = 1
		cur_num = nums
		while cur_num+1 in hs:
			cur_len += 1
			cur_num += 1
		longest = max(longest, cur_len)

return longest
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


class 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表主要功能是:记录,当做查找表,时间换空间的一种策略

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值