查找
349. 两个数组的交集
利用set的不重复性,
1 | def intersection(self, nums1: List[int], nums2: List[int]) |
62 ms
也可以直接使用set的求交符号,但是底层实现类似
1 | def intersection(self, nums1: List[int], nums2: List[int]) |
84 ms
350. 两个数组的交集 II
增加了次数的要求,此时就需要一个计数表,使用Counter简单实现
1 | def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: |
时间 88 ms 有点慢, 复杂度是O(M+N)的
为什么很慢在提示给出了,nums1很小,nums2很大,所以可以稍微加一句if len(nums1) < len(nums2): nums2, nums1 = nums1, nums2
让conter执行较长的,循环较小的,速度比较稳定在60 ms
202. 快乐数
1 | 输入:19 |
定义: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
题目的建模过程是简单的,分开然后求平方和,不为1就继续,需要判断的是,在发生始终变不到1的情况下,如何及时跳出。而且每一各数字对应的下一个数字都是绝对的,是一个链表一样的情况。
仔细思考可以发现,一个数字的平凡和结果最后是不可能溢出的,那么这个while循环的结果只有两种,变成了1,或者变成了之前的数字,导致有环
用一个set来记录之前出现过的数字,一直迭代下去,如果是出现了重复的数字就是环,返回False就行,这样代码就很简单了
1 | def isHappy(self, n: int) -> bool: |
290. 单词规律
1 | 输入: pattern = "abba", str = "dog cat cat dog" |
遵循 指完全匹配,例如, pattern
里的每个字母和字符串 str
中的每个非空单词之间存在着双向连接的对应规律
很明显的映射关系,只要一个个匹配就行,对pattern中的每个a,b,c 都存放在一个dict,a对应的是dog
pattern | str_list |
---|---|
a | dog |
b | cat |
c | apple |
1 | def wordPattern(self, pattern: str, str: str) -> bool: |
算法时间 40 ms 复杂度是O(N)级别
451. 根据字符出现频率排序
这个就是典型的排序加哈希表题,哈希表存储每个字符的出现次数
1 | 输入: |
采用Counter 来计数,喜欢自己写的也可以用dict实现,效率没有太大区别
1 | def frequencySort(self, s: str) -> str: |
执行时间 40 ms
242. 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词
1 | 输入: s = "anagram", t = "nagaram" |
满足字符串的长度,字母出现的次数一致即可,那还是用两个Counter来实现应该最为简单
1 | def isAnagram(self, s: str, t: str) -> bool: |
时间:44 ms, 在所有 Python3 提交中击败了96.13%的用户
205. 同构字符串
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身
这个题和上面的单词规律是一样,都检查映射关系是否正确:
一个非常python 的写法是
map(s.index, s) == map(t.index, t)
由于返回的是map的对象,没有实现 == 运算符重载
1 | def isIsomorphic(self, s: str, t: str) -> bool: |
540. 有序数组中的单一元素
一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数
1 | 输入: [1,1,2,3,3,4,4,8,8] |
如果全都是两个的,那么肯定num[奇数] == nums[偶数],由于只有一个,导致后面发生变化,每一次取一个mid,来缩短查询距离,如果mid是偶数,那么和1异或的话,那么得到的是mid+1,如果mid是奇数,得到的是mid-1。如果相等的话,那么唯一的元素还在这之后,往后找就可以了
1 | def singleNonDuplicate(self, nums): |