LeetCode 每日一题 2023/10/30-2023/11/5

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步


目录

      • 10/30 275. H 指数 II
      • 10/31 2003. 每棵子树内缺失的最小基因值
      • 11/1 2127. 参加会议的最多员工数
      • 11/2 2103. 环和杆
      • 11/3 117. 填充每个节点的下一个右侧节点指针 II
      • 11/4
      • 11/5


10/30 275. H 指数 II

二分查找

def hIndex(citations):
    """
    :type citations: List[int]
    :rtype: int
    """
    n = len(citations)
    l,r = 0,n-1
    while l<=r:
        mid = (l+r)>>1
        if citations[mid]==n-mid:
            return n-mid
        elif citations[mid]<n-mid:
            l = mid+1
        else:
            r = mid-1
    return n-l




10/31 2003. 每棵子树内缺失的最小基因值

dfs 如果子树基因没有1 则答案全为1
从基因为1的子节点往上判断

def smallestMissingValueSubtree(parents, nums):
    """
    :type parents: List[int]
    :type nums: List[int]
    :rtype: List[int]
    """
    n = len(parents)
    ans = [1]*n
    if 1 not in nums:
        return ans
    
    g = [[] for _ in range(n)]
    for i in range(1,n):
        g[parents[i]].append(i)
    
    mem = set()
    def dfs(x):
        mem.add(nums[x])
        for nxt in g[x]:
            if nums[nxt] not in mem:
                dfs(nxt)
    miss = 2
    node = nums.index(1)
    while node>=0:
        dfs(node)
        while miss in mem:
            miss +=1
        ans[node] = miss
        node = parents[node]
    return ans
            



11/1 2127. 参加会议的最多员工数

拓扑排序
先剪掉图中树枝
在遍历环上的点
参考https://leetcode.cn/problems/maximum-employees-to-be-invited-to-a-meeting/solutions/1187830/nei-xiang-ji-huan-shu-tuo-bu-pai-xu-fen-c1i1b/?envType=daily-question&envId=2023-11-01

def maximumInvitations(favorite):
    """
    :type favorite: List[int]
    :rtype: int
    """
    from collections import deque
    n = len(favorite)
    deg = [0]*n
    for f in favorite:
        deg[f]+=1
    
    maxdep = [1]*n
    q = deque(i for i,d in enumerate(deg) if d==0)
    while q:
        x = q.popleft()
        y = favorite[x]
        maxdep[y] = maxdep[x]+1
        deg[y]-=1
        if deg[y]==0:
            q.append(y)
    
    maxring = sumchain = 0
    for i,d in enumerate(deg):
        if d==0:
            continue
        deg[i] = 0
        ringsize = 1
        x = favorite[i]
        while x!=i:
            deg[x] = 0
            ringsize+=1
            x = favorite[x]
        if ringsize ==2:
            sumchain +=maxdep[i]+maxdep[favorite[i]]
        else:
            maxring = max(maxring,ringsize)
    return max(maxring,sumchain)




11/2 2103. 环和杆

依序判断 l[i]记录位置i的各个颜色状态

def countPoints(rings):
    """
    :type rings: str
    :rtype: int
    """
    l = [0]*10
    n = len(rings)
    m = {'R':1,'G':2,'B':4}
    for i in range(0,n,2):
        c,loc = rings[i],int(rings[i+1])
        l[loc] |=m[c]
    
    ans = 0
    for i in range(10):
        if l[i]==7:
            ans +=1
    return ans



11/3 117. 填充每个节点的下一个右侧节点指针 II

BFS 广搜遍历每一层

class Node(object):
    def __init__(self, val=0, left=None, right=None, next=None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next

def connect(root):
    """
    :type root: Node
    :rtype: Node
    """
    if not root:
        return root
    l = [root]
    while l:
        tmp = []
        for node in l:
            if node.left:
                tmp.append(node.left)
            if node.right:
                tmp.append(node.right)
        l.append(None)
        for i in range(len(l)-1):
            l[i].next = l[i+1]
        l = tmp
    return root



11/4





11/5





你可能感兴趣的:(Exercise,leetcode,算法,职场和发展)