二刷力扣--哈希表

这篇具有很好参考价值的文章主要介绍了二刷力扣--哈希表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈希表

哈希表可以根据键在O(1)时间内进行访问。
哈希表实际上可以看成是一个数组,但是可以通过哈希函数计算出数组下标,直接访问。

常用的有集合set(),字典dict()

有效的字母异位词 242.

#字典
给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

  1. 使用数组
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        record = [0] * 26
        for i in s:
            #并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
            record[ord(i) - ord("a")] += 1
        for i in t:
            record[ord(i) - ord("a")] -= 1
        return  all(x == False for x in record)
  1. 使用字典
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        from collections import defaultdict
        s_dict = defaultdict(int)
        t_dict = defaultdict(int)
        for x in s:
            s_dict[x] += 1
        for x in t:
            t_dict[x] += 1
        return s_dict == t_dict

Python还提供了一个默认的计数器Counter,效果和上面一样。

class Solution(object):
    def isAnagram(self, s: str, t: str) -> bool:
        from collections import Counter
        return Counter(s) == Counter(t)

两个数组的交集 349.

#集合
给定两个数组 nums1nums2 ,返回 它们的交集
Python 的set实现了集合运算,直接转换成集合然后求交。

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        set_1 = set(nums1)
        set_2 = set(nums2)
        return  list(set_1 & set_2)

快乐数 202.

#集合
编写一个算法来判断一个数 n 是不是快乐数。

使用集合来判断n有没有出现过。

class Solution:
    def isHappy(self, n: int) -> bool:
        def get_sum(num):
            s = 0
            while num:     
                s +=  (num % 10)** 2
                num =  num // 10
            return s
        
        visited = set()
        while n != 1 and  not n in visited:
            visited.add(n)
            n = get_sum(n)

        return  n == 1

除了正常的取余获得num各位数字,还可以用字符串:

n = sum(int(i) ** 2 for i in str(n))

两数之和 1.

#字典
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
容易想到用暴力循环来两两匹配,时间复杂度为O(N^2)。但是学完字典后,可以想到用字典存储出现过的数字及下标。 遍历过程中可以查看字典中是否有能组成target的数。时间复杂度为O(N)。
(也可以用集合存储数字,但是还需要找一次下标)

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        d = dict()
        for i,n in enumerate(nums):
            if target-n in d:
                return i, d[target-n]
            else:
                 d[n] = i

四数相加II 454.

#字典
给你四个整数数组 nums1nums2nums3nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

两数相加的扩展版。
从四个数组中各取一个数,和为0。
容易想到将四数相加变成两数相加。这样就将4重循环变成2重循环。
nums1 + nums2 = -(nums3 + nums4)

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        d = defaultdict(int)
        for i in nums1:
            for j in nums2:
                d[i+j]  += 1
        count  = 0 
        for k in nums3:
            for l in nums4:
                count += d[-(k+l)]
        return count

赎金信 383.

#字典
给你两个字符串:ransomNotemagazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

和 有效的字母异位词有点像,但是这里只要magazine中字符数量大于ransomNote

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        d_ransomNote = Counter(ransomNote)
        d_magazine = Counter(magazine)
        for k,v in d_ransomNote.items():
            if k not in d_magazine or d_magazine[k] < v:
                return False
        return True

三数之和 15.

#字典 #双指针
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。
可以用字典做,两重循环确定num[i]nums[j],然后用字典确定是否有nums[k] == -(nums[i]+ nums[j])

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        d = defaultdict(list)
        for i,n in enumerate(nums):
            d[n].append(i)
        res = set()
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if  -(nums[i] + nums[j]) in d and d[-(nums[i] + nums[j])] != [i] \
                and d[-(nums[i] + nums[j])] != [j]  and d[-(nums[i] + nums[j])] != [i,j]:
                    res.add(tuple(sorted([nums[i], nums[j],-(nums[i] + nums[j]) ])))

        return [list(t) for t in res]

双指针:
需要先对nums排序。
固定i后,用指针left和right找剩余的两个数。
(这里我去重直接用了set,没有像网站那样额外判断。)

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        res = set()
        for i in range(len(nums)):
            if nums[i] > 0:
                break
            if i > 0 and nums[i] == nums[i-1]:
                continue
            left = i+1
            right = len(nums) - 1
            while right > left:
                s = nums[i] + nums[left] + nums[right]
                if s < 0:
                    left += 1
                elif s > 0:
                    right -= 1
                else:
                    res.add((nums[i], nums[left], nums[right]))

                    right -= 1
                    left += 1
        return  [list(t)  for t in res]

四数之和 18.

#双指针
在三数之和的基础上再套一层for循环。

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:   
        nums.sort()
        res  = set()
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                left = j+1
                right = len(nums) - 1
                
                while left < right:
                    s = nums[i]+nums[j] + nums[left] + nums[right]
                    if s < target:
                        left += 1
                    elif s > target:
                        right -= 1
                    else:
                        res.add((nums[i],nums[j] , nums[left] , nums[right]))
                        left += 1
                        right -= 1

        return  [list(t)  for t in res]

哈希表小结

哈西表常用来判断元素是否出现过,统计出现次数去重
本章题目大多数和数组相关,用到了对数组排序双指针的方法。文章来源地址https://www.toymoban.com/news/detail-732972.html

到了这里,关于二刷力扣--哈希表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode】剑指 Offer <二刷>(3)

    目录 题目:剑指 Offer 06. 从尾到头打印链表 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 07. 重建二叉树 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 这道题我读完之后想到了两种思路,1、直接从后往前去链表

    2024年02月10日
    浏览(54)
  • 【LeetCode】剑指 Offer <二刷>(1)

    目录 前言: 题目:剑指 Offer 03. 数组中重复的数字 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 刚学 golang 半个多月,看了一堆的文档啊,框架啊,许许多多的东西,学到了很多,但是代码没有怎么上手写,所以我就决定用 golang 二刷剑指 Offe

    2024年02月09日
    浏览(42)
  • 【LeetCode】剑指 Offer <二刷>(5)

    目录 题目:剑指 Offer 10- II. 青蛙跳台阶问题 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 11. 旋转数组的最小数字 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 这道题乍一看好像没什么思路,但是我们不妨把题

    2024年02月09日
    浏览(36)
  • 【LeetCode】剑指 Offer <二刷>(4)

    目录 题目:剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 10- I. 斐波那契数列 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 这道题我用 C++ 写的时候是比较简单顺手的,用 STL 可以

    2024年02月10日
    浏览(43)
  • 【LeetCode】剑指 Offer <二刷>(7)

    目录 题目:剑指 Offer 14- I. 剪绳子 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 14- II. 剪绳子 II - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 这道题我想到两种方法,一个方法是用动态规划,一是利用数学规律

    2024年02月09日
    浏览(36)
  • 【LeetCode】剑指 Offer <二刷>(6)

    目录 题目:剑指 Offer 12. 矩阵中的路径 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 13. 机器人的运动范围 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 这是一道经典的搜索题,用和是深度优先搜素,这个方法

    2024年02月09日
    浏览(44)
  • 二刷LeetCode--48. 旋转图像(C++版本),数学题

    思路:主要是观察变化之后的数组和最开始的数组的区别,不难发现,先转置在左右镜像对称即可。需要注意的是转置和镜像对称中for变量的终止条件。

    2024年02月12日
    浏览(40)
  • 二刷LeetCode--146.LRU缓存(C++版本),必会题目

    本题思路:因为需要记录元素的出入顺序,并且每次访问之后需要将该节点提到最前面,因此需要使用双向链表(单链表不方便删除操作),而为了可以在常量时间复杂度内找到对应的元素,我们需要使用哈希表,将每一个插入的元素在哈希表中进行记录.哈希表的key就是插入的key,而哈希

    2024年02月13日
    浏览(40)
  • AI刷力扣

     前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:点击跳转 目录 2. 两数相加 4. 寻找两个正序数组的中位数 5. 最长回文子串(python) 6. N 字形变换 10. 正则表达式匹配(python) 13. 罗马数字转整数 16. 最接近的三数之和(python) 1

    2024年02月06日
    浏览(115)
  • LeetCode刷题 --- 哈希表

    1. 两数之和 解题思路: 利用哈希表,key存数组当前值,value存数组下标 两数之和等于target,可以看做是两个数是配对 遍历数组,看哈希表中有没有值和这个当前值配对,如果没有,就存入哈希表 如果有,当前数,和配对的数,就是所求值。 3. 无重复字符的最长子串 解题

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包