LeetCode冲刺:Day50

发布于 2022-12-27  41 次阅读


1. 数组中紧跟 key 之后出现最频繁的数字

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

按范围遍历,用字典记录频率即可。

代码

class Solution:
    def mostFrequent(self, nums: List[int], key: int) -> int:
        dic = defaultdict(int)
        for i in range(len(nums) - 1):
            if nums[i] == key: dic[nums[i + 1]] += 1
        nums = list(dic.keys())
        ans = 0
        maxF = 0
        for num in nums:
            if dic[num] > maxF:
                ans = num
                maxF = dic[num]
        return ans

2. 将杂乱无章的数字排序

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

将排序算法的键值设置好就行,注意下数字本身为0的情况要特殊处理。因为算法默认是 stable 的,所以符合要求。

代码

class Solution:
    def sortJumbled(self, mapping: List[int], nums: List[int]) -> List[int]:
        def trans(x: int) -> int:
            if x == 0: return mapping[0]
            res = 0
            i = 0
            while x:
                res += mapping[(x % 10)] * pow(10, i)
                x //= 10
                i += 1
            return res
        return sorted(nums, key = lambda x: trans(x))

3. 有向无环图中一个节点的所有祖先

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

一次过,效率也还行。

要找所有祖先,其实就是找路径反转后的所有孩子。

用集合记录每个节点的所有孩子即可。另用一个数组记录当前节点是否已经求过孩子集合。最后返回每个集合排序后的列表即可。

代码

class Solution:
    def getAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]:
        graph = [[] for i in range(n)]
        for e in edges:
            graph[e[1]].append(e[0])
        computed = [0 for i in range(n)]
        fathers = [set() for i in range(n)]
        def dfs(cur: int) -> Set[int]:
            if computed[cur]: return fathers[cur]
            fc = set()
            for v in graph[cur]:
                fc.add(v)
                fc = fc.union(dfs(v))
            computed[cur] = 1
            fathers[cur] = fc
            return fc
        for i in range(n):
            dfs(i)
        return [sorted(list(fathers[i])) for i in range(n)]

4. 统计包含给定前缀的字符串

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

试了次一行流hh

代码

class Solution:
    def prefixCount(self, words: List[str], pref: str) -> int:
        return sum(w.find(pref) == 0 for w in words)

5. 使两字符串互为字母异位词的最少步骤数

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

又是一行流。枚举每一个字母,计算两个字符串在这个字母上的绝对差。双百。

代码

class Solution:
    def minSteps(self, s: str, t: str) -> int:
        return sum(abs(s.count(chr(97 + i)) - t.count(chr(97 + i))) for i in range(26))

6. 完成旅途的最少时间

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

感觉不在周赛的时候脑子更灵活点hh

一眼感觉可以用二分查找答案做,果然一次通过,效率也不错。

代码

class Solution:
    def minimumTime(self, time: List[int], totalTrips: int) -> int:
        l, r = 1, totalTrips * max(time)
        ans = r
        while l <= r:
            m = (l + r) // 2
            if sum(m // t for t in time) >= totalTrips:
                ans = ans if ans < m else m
                r = m - 1
            else: l = m + 1
        return ans