代码随想录算法训练营第六天 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

什么时候使用哈希法: 

当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候

242.有效的字母异位词

Valid Anagram - LeetCode

解题思路

只有小写字母,想到可以用数组d,来记录字符串s里每个字符出现的次数,大小为26。

数组是一个简单的哈希表。使用数组来做哈希的题目,是因为题目都限制了数值的大小。如果没有限制数值的大小,就无法使用数组来做哈希表了。如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

把字符映射到数组的index上,从a到z的ascii number是26个连续的数值,所以a映射index是0, z是25。

遍历s,将d[ord(s[i]) - ord(‘a’) ] += 1

同时遍历t,检查t中是否出现了这些字符,将d[ord(t[i]) - ord(‘a’) ] -= 1

最后检查数组的数值, 如果有不为0的,说明不是anagram. 如果都为0,说明是。

遇到的问题

注意s[i] - ‘a’ 是两个string相减,会报错,要用ord: d[ord(s[i]) - ord(‘a’) ]

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:				
				if len(s) != len(t):
            return False
        d = [0]*26
        for i in range(len(s)):
            d[ord(s[i]) - ord('a')] += 1
            d[ord(t[i]) - ord('a')] -= 1
        for char in d:
            if char != 0:
                return False
        return True

时间复杂度 O(N)

空间复杂度 O(1) 是一个常量大小的辅助数组


349. 两个数组的交集

Intersection of Two Arrays - LeetCode

解题思路

直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。耗时在数据量大的情况,差距是很明显的。

数组都是 1000以内的。数组是一个简单的哈希表。使用数组来做哈希的题目,是因为题目都限制了数值的大小。如果没有限制数值的大小,就无法使用数组来做哈希表了。如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

定义一个数组a,大小为1001.

遍历nums1, a[num] = 1

遍历nums2,检查每个数字a[n] 的值是否等于1。如果等于1,放进res数组,并将a[n] == 0

return res

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # because nums length and value <= 1000, can use an array 
        a = [0] * 1001
        res = []
        for num in nums1:
            a[num] = 1

        for num in nums2:
            if a[num] == 1:
                res.append(num)
                a[num] = 0
        return res

时间复杂度 O(N)

空间复杂度 O(N)


 202. 快乐数  

Happy Number - LeetCode

解题思路

题目中说了会 无限循环,也就是说求和的过程中,和会重复出现,这对解题很重要!

当我们遇到了要快速判断一个元素是否出现在集合里的时候,就要考虑哈希法了。

使用set,来判断这个和是否重复出现,如果重复了就return false, otherwise一直找到和为1为止。

遇到的问题

难点是求和的部分怎么写

class Solution:
    def isHappy(self, n: int) -> bool:
        def getNext(n):
            total = 0
            while n > 0:
                n, digit = divmod(n, 10)
                total += digit **2
            return total
        
        s = set()
        while n != 1 and n not in s:
            s.add(n)
            n = getNext(n)
            
        return n == 1

时间复杂度 O(logN)

空间复杂度 O(logN)


1. 两数之和

Two Sum - LeetCode

解题思路

不仅要知道数组元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存index,所以选map。

遍历数组, 查询map里是否有和当前遍历数值匹配的数值(target -num):

如果有,即找到了匹配的pair

如果没有,用map存放访问过的元素

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

时间复杂度 O(N)

空间复杂度 O(N)

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值