LeetCode 每日一题 2023/8/21-2023/8/27

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


目录

      • 8/21 2337. 移动片段得到字符串
      • 8/22 849. 到最近的人的最大距离
      • 8/23 1782. 统计点对的数目
      • 8/24 1267. 统计参与通信的服务器
      • 8/25 1448. 统计二叉树中好节点的数目
      • 8/26 228. 汇总区间
      • 8/27 56. 合并区间


8/21 2337. 移动片段得到字符串

双指针

def canChange(start, target):
    """
    :type start: str
    :type target: str
    :rtype: bool
    """
    n=len(start)
    i,j=0,0
    while True:
        while i<n and start[i]=='_':
            i+=1
        while j<n and target[j]=='_':
            j+=1
        if i==n and j==n:
            return True
        if i>=n or j>=n or start[i]!=target[j]:
            return False
        if start[i]=='L' and i<j:
            return False
        if start[i]=='R' and i>j:
            return False
        i+=1
        j+=1



8/22 849. 到最近的人的最大距离

从头遍历 记录上一个有人的位置 计算间隔空位长度

def maxDistToClosest(seats):
    """
    :type seats: List[int]
    :rtype: int
    """
    n=len(seats)
    preloc = -1
    ans = -1
    for i in range(n):
        if seats[i]==1:
            if preloc==-1:
                ans = i
            else:
                ans = max(ans,(i-preloc)//2)
            preloc = i
    if preloc<n-1:
        ans = max(ans,n-1-preloc)
    return ans



8/23 1782. 统计点对的数目

计算每个点度数deg
所有cnt求后缀和
https://leetcode.cn/problems/count-pairs-of-nodes/solutions/2400682/ji-bai-100cong-shuang-zhi-zhen-dao-zhong-yhze/

def countPairs(n, edges, queries):
    """
    :type n: int
    :type edges: List[List[int]]
    :type queries: List[int]
    :rtype: List[int]
    """
    from collections import Counter
    deg=[0]*(n+1)
    cnte = {}
    for x,y in edges:
        if x>y:
            x,y=y,x
        deg[x]+=1
        deg[y]+=1
        cnte[(x,y)] = cnte.get((x,y),0)+1
    cntdeg=Counter(deg[1:])
    
    cnts=[0]*(max(deg)*2+2)
    for deg1,c1 in cntdeg.items():
        for deg2,c2 in cntdeg.items():
            if deg1<deg2:
                cnts[deg1+deg2]+=c1*c2
            elif deg1==deg2:
                cnts[deg1+deg2]+=c1*(c1-1)//2
    for (x,y),c in cnte.items():
        s=deg[x]+deg[y]
        cnts[s]-=1
        cnts[s-c]+=1
    for i in range(len(cnts)-1,0,-1):
        cnts[i-1]+=cnts[i]
    for i,q in enumerate(queries):
        queries[i] = cnts[min(q+1,len(cnts)-1)]
    return queries



8/24 1267. 统计参与通信的服务器

r,w记录当前行列存在几台服务器

def countServers(grid):
    """
    :type grid: List[List[int]]
    :rtype: int
    """
    n,m=len(grid),len(grid[0])
    r=[0]*n
    w=[0]*m
    pos = []
    for i in range(n):
        for j in range(m):
            if grid[i][j]:
                r[i]+=1
                w[j]+=1
    ans = 0
    for i,j in pos:
        if r[i]>1 or w[j]>1:
            ans+=1
    return ans




8/25 1448. 统计二叉树中好节点的数目

从根节点出发记录当前经过的最大值

class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
def goodNodes(root):
    """
    :type root: TreeNode
    :rtype: int
    """
    def func(node,v):
        ans = 0
        if node==None:
            return ans
        nxt = max(node.val,v)
        if node.val==nxt:
            ans+=1
        return ans+func(node.left,nxt)+func(node.right,nxt)
    return func(root,root.val)


8/26 228. 汇总区间

因为有序 所以从头开始判断
记录当前区间起始s 当前值cur

def summaryRanges(nums):
    """
    :type nums: List[int]
    :rtype: List[str]
    """
    ans = []
    if len(nums)==0:
        return ans
    s = nums[0]
    cur = s
    for v in nums[1:]:
        if cur+1==v:
            cur = v
        else:
            if cur==s:
                ans.append(str(cur))
            else:
                ans.append(str(s)+"->"+str(cur))
            s = v
            cur = s
    if cur==s:
        ans.append(str(cur))
    else:
        ans.append(str(s)+"->"+str(cur))
    return ans



8/27 56. 合并区间

将起始位置从小到大排序 记录当前最右端位置now
每一个点更新最右端位置
如果now在当前起点左侧 则重新开始一个新区间
否则更新now

def merge(intervals):
    """
    :type intervals: List[List[int]]
    :rtype: List[List[int]]
    """
    ret = []
    if len(intervals) == 0:
        return ret
    intervals.sort(key=lambda x:x[0])
    now = intervals[0]
    for v in intervals[1:]:
        if v[0] <= now[1]:
            now[1] = max(now[1],v[1])
        else:
            ret.append(now)
            now = v
    ret.append(now)
    return ret



你可能感兴趣的:(Exercise,leetcode,算法)