跟着leedcode刷算法 -- 哈希与映射

73 阅读2分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

image.png

题1

Excel表列序号

给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回该列名称对应的列序号。

例如,

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...

 

示例 1:

  • 输入: columnTitle = "A"

  • 输出: 1 示例 2:

  • 输入: columnTitle = "AB"

  • 输出: 28 示例 3:

  • 输入: columnTitle = "ZY"

  • 输出: 701 示例 4:

  • 输入: columnTitle = "FXSHRXW"

  • 输出: 2147483647  

提示:

  • 1 <= columnTitle.length <= 7
  • columnTitle 仅由大写英文组成
  • columnTitle 在范围 ["A", "FXSHRXW"] 内 相关标签
  • 数学
  • 字符串

本题就是一个找规律的题,对字母进行ord 然后进行26进制转化 最后寻求结果

class Solution:
    def titleToNumber(self, columnTitle: str) -> int:
        num = len(columnTitle)
        ans = 0
        for row in columnTitle:
            ans += 26**(num-1)*(ord(row)-64)
            num -= 1
        return ans

执行结果:

image.png

题2

四数相加 II

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

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

示例 1:

  • 输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]

  • 输出:2 解释:

  • 两个元组如下:

    1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
    1. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0 示例 2:
  • 输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]

  • 输出:1  

**  提示:**

  • n == nums1.length
  • n == nums2.length
  • n == nums3.length
  • n == nums4.length
  • 1 <= n <= 200
  • -228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228 相关标签
  • 数组
  • 哈希表

思路: 分组、计数


class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        doc = dict()
        res = 0
        for i in nums1:
            for j in nums2:
                if i + j in doc:
                    doc[i + j] += 1
                else:
                    doc[i + j] = 1
        
        for k in nums3:
            for l in nums4:
                if - k - l in doc:
                   res += doc[- k - l] 
        return res


执行结果:

image.png

题3

常数时间插入、删除和获取随机元素

实现RandomizedSet 类:

  • RandomizedSet() 初始化 RandomizedSet 对象
  • bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
  • bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
  • int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
  • 你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。

示例

输入

  • ["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
  • [[], [1], [2], [2], [], [1], [2], []] 输出
  • [null, true, false, true, 2, true, false, 2]

解释

  • RandomizedSet randomizedSet = new RandomizedSet();
  • randomizedSet.insert(1); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。
  • randomizedSet.remove(2); // 返回 false ,表示集合中不存在 2 。
  • randomizedSet.insert(2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。
  • randomizedSet.getRandom(); // getRandom 应随机返回 1 或 2 。
  • randomizedSet.remove(1); // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。
  • randomizedSet.insert(2); // 2 已在集合中,所以返回 false 。
  • randomizedSet.getRandom(); // 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。

提示:

  • -231 <= val <= 231 - 1
  • 最多调用 insert、remove 和 getRandom 函数 2 * 105 次
  • 在调用 getRandom 方法时,数据结构中 至少存在一个 元素。 相关标签
  • 设计
  • 数组
  • 哈希表
  • 数学
  • 随机化

思路: 列表 & 字典

class RandomizedSet:

    def __init__(self):
        self.nums1 = {}
        self.nums2 = []

    def insert(self, val: int) -> bool:
        if val in self.nums1:
            return False
        self.nums1[val] = len(self.nums2)
        self.nums2.append(val)
        return True


    def remove(self, val: int) -> bool:
        if val in self.nums1:
            idx, tail = self.nums1[val], self.nums2[-1]
            self.nums2[idx], self.nums1[tail] = tail, idx
            self.nums2.pop()
            del self.nums1[val]
            return True
        return False

    def getRandom(self) -> int:
        return self.nums2[random.randrange(0,len(self.nums2))]


# Your RandomizedSet object will be instantiated and called as such:
# obj = RandomizedSet()
# param_1 = obj.insert(val)
# param_2 = obj.remove(val)
# param_3 = obj.getRandom()

执行结果:

image.png