力扣刷题Day 6 | 242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法,是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

242.有效的字母异位词

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili

笔记

  1. 第一种思路是用数组,数组大小为26,初始化为0,每个位置记录对应字母出现的次数,字母a出现次数的下标为ord(a)-ord(a),即0,同理,字母b出现次数的下标为ord(b)-ord(a)……。遍历第一个字符串时,对应次数加一,遍历第二个字符串时,对应次数减一,最后遍历数组,如果有位置的值不为0,说明对应字母的出现次数不一样
  2. 第二种思路使用collections中的defaultdict(int)方法,用一个字典存第一个字符串的字母及对应出现次数,第二个字典存另一个字符串的字母及对应出现次数,最后判断两字典是否相等
  3. 第三种思路使用collections的Counter(s)方法,判断Counter(s)是否等于Counter(t)

Python代码

#思路一

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        res = [0]*26

        for i in s:
            res[ord(i)-ord('a')] += 1
        
        for j in t:
            res[ord(j)-ord('a')] -= 1

        for i in res:
            if i != 0:
                return False
        
        return True

#------------------------------------------------------------------------

#思路二

from collections import defaultdict

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        dict_s = defaultdict(int)
        dict_t = defaultdict(int)
        for i in s:
            dict_s[i] += 1

        for j in t:
            dict_t[j] += 1

        return dict_s == dict_t


#------------------------------------------------------------------------

#思路三

from collections import Counter

return Counter(s) == Counter(t)




349. 两个数组的交集

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集_哔哩哔哩_bilibili

笔记

  1. 最直白的思路,用集合,判断是否有交集(交集:&  并集:|)
  2. 也可以用字典defaultdict(int)

Python代码

#用集合

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        set1 = set(nums1)
        set2 = set(nums2)

        return list(set1 & set2)

#用字典defaultdict
class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:

        from collections import defaultdict
        dict1 = defaultdict(int)

        res = []

        for i in nums1:
            dict1[i] += 1

        for k,v in dict1.items():
            if k in nums2:
                res.append(k)
        
        return res


202. 快乐数

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章讲解

代码随想录

笔记

  1. 定义一个求数字各位数平方和的函数sumNumber(n)
  2. 关键点在于题目说平方和出现循环,也就是和之前重复的数值,那么该数就不是快乐数,因此用一个字典存放每次的各位数平方和,每次计算新的各位数平方和时先判断该值在不在字典中,如果在就返回False,不是就继续循环,直到找到值为1返回True。

Python代码

class Solution:

    def isHappy(self, n: int) -> bool:
        def sumNumber(a):
            s = len(str(a))
            res = 0
            for i in range(s):
                res += pow(a%10,2)
                a //= 10
            return res

        from collections import defaultdict

        tmpDict = defaultdict(int)
        k = sumNumber(n)
        while k != 1:
            if k in tmpDict:
                return False
            else:
                tmpDict[k] += 1
                k = sumNumber(k)
        return True


1. 两数之和 

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

梦开始的地方,Leetcode:1.两数之和,学透哈希表,map使用有技巧!_哔哩哔哩_bilibili

笔记

  1. 用一个字典存放遍历过的元素值及对应的下标
  2. 遍历新元素时,判断target减去当前元素的差值是否在字典中,如果在,说明找到了答案,返回对应下标组成的数组;如果不在,把当前值和对应的下标存到字典中,继续往后遍历,直到找到符合条件的下标返回,因为题目说一定存在答案
  3. 该思路实现了时间复杂度为O(n)的算法

Python代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        from collections import defaultdict

        dict1 = defaultdict(int)

        for i in range(len(nums)):
            if target-nums[i] in dict1:
                return [dict1[target-nums[i]], i]
            else:
                dict1[nums[i]] = i

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值