使用hash列表的算法

时间复杂度

访问:在hash中其实是不存在访问的概念的,因为我们是之间通过key查询的,在hash中不存在索引概念,所以key不能被看成索引
搜索:使用key进行搜索的时候是O(1),使用value搜索的时候是O(N),如果存在碰撞,则为O(K),其中K为链表的元素个数
插入:O(1)
删除:O(1)

练习题

  1. 217存在重复元素

方法一

解题思路

hash这种数据结构有个特性就是其中的key是唯一的。所以我们可以建立一个hash列表,然后使用nums中的元素作为key,如果这个key被加1了,那么说明其中有重复值,否在没重复。

代码

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        d = {}
        for i in nums:
            if d.get(i):
                d[i] += 1
                return True
            else:
                d[i] = 1 
        return False

方法二

解题思路

python中还有股个数据结构对应hash的,就是set。它记录的元素就是key,所以我们可以直接使用它对nums进行去重处理。如果去重后的长度与去重前的长度一致,则说明没用重复值,否在有重复值

代码

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        return len(nums) == len(set(nums))
  1. 389找不同

解法一

解题思路

这里使用了三个技巧,一个是把字符转换为ascii,第二个是字符串可以直接拼接,第三个是因为两个字符串除了新增的字符以外,其他字符最终都是偶数个,所以可以使用正负抵消,最终数目不为0的就是我们要找的字符。第一个技巧我没有直接使用数组,所以其实在这里可以不使用,但是我这里是为了记录一下这个技巧。这里可以直接使用字符作为key,毕竟是字典类型嘛

代码

class Solution:
    def findTheDifference(self, s: str, t: str) -> str:
        num = 97
        d = {}
        s_t = s + t
        for i in s_t:
            n = ord(i) - num
            if not d.get(n):
                d[n] = 1
                continue
            if d[n] == 1:
                d[n] -= 1
            else:
                d[n] += 1
        for j, v in d.items():
            if v == 1:
                return chr(j + num)

解法二

解题思路

使用两个字典进行统计数据比较

代码

class Solution:
    def findTheDifference(self, s: str, t: str) -> str:
        d = {}
        d_j= {}
        for i in s:
            if d.get(i):
                d[i] += 1
            else:
                d[i] = 1
        for j in t:
            if not d.get(j):
                return j
            if d_j.get(j):
                d_j[j] += 1
            else:
                d_j[j] = 1
        for k, v in d.items():
            if d_j[k] != v:
                return k

解法三

解题思路

因为这两个字符串全是小写字母,所以是有规律的,可以使用排序的方式,把字符串转为list,然后进行排序,循环字符串t所得的list,如果下标值等于字符串s的长度,则t所得list的最后一位就是我们要找的字符。如果同一个下标下所对应的字符不一致,则这个下标下的t所得的list,是我们要找的字符

代码

class Solution:
    def findTheDifference(self, s: str, t: str) -> str:
        s_list = sorted(list(s))
        t_list = sorted(list(t))
        for i, v in enumerate(t_list):
            if len(s_list) == i:
                return v
            if v != s_list[i]:
                return v
posted @ 2022-08-09 21:50  影梦无痕  阅读(25)  评论(0)    收藏  举报