0
点赞
收藏
分享

微信扫一扫

算法Day14 | 理论基础,144. 二叉树的前序遍历,94.二叉树的中序遍历,145.二叉树的后序遍历

生命中最美的是成长 2023-05-23 阅读 94

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


目录



5/15 1072. 按列翻转得到最大值等行数

def maxEqualRowsAfterFlips(matrix):
    """
    :type matrix: List[List[int]]
    :rtype: int
    """
    from collections import defaultdict
    n,m=len(matrix),len(matrix[0])
    mem=defaultdict(int)
    for i in range(n):
        tag = ""
        for j in range(m):
            tag+=str((0^matrix[i][0])^matrix[i][j])
        mem[tag]+=1
    return max(mem.values())



5/16 1335. 工作计划的最低难度

def minDifficulty(jobDifficulty, d):
    """
    :type jobDifficulty: List[int]
    :type d: int
    :rtype: int
    """
    n = len(jobDifficulty)
    if d>n:
        return -1
    mem = {}
    
    def dfs(d,ind):
        if (d,ind) in mem:
            return mem[(d,ind)]
        if d==0:
            return max(jobDifficulty[:ind+1])
        ans = float("inf")
        mx = 0
        for k in range(ind,d-1,-1):
            mx = max(mx,jobDifficulty[k])
            ans = min(ans,dfs(d-1,k-1)+mx)
        mem[(d,ind)] = ans
        return ans
    return dfs(d-1,n-1)



5/17 2446. 判断两个事件是否存在冲突

def haveConflict(event1, event2):
    """
    :type event1: List[str]
    :type event2: List[str]
    :rtype: bool
    """
    def trans(s):
        l = s.split(":")
        return 60*int(l[0])+int(l[1])
    s1,e1 = trans(event1[0]),trans(event1[1])
    s2,e2 = trans(event2[0]),trans(event2[1])
    if e1<s2 or e2<s1:
        return False
    return True



5/18 1073. 负二进制数相加

def addNegabinary(arr1, arr2):
    """
    :type arr1: List[int]
    :type arr2: List[int]
    :rtype: List[int]
    """
    i,j=len(arr1)-1,len(arr2)-1
    ans = []
    c = 0
    
    while i>=0 or j>=0 or c:
        x = c
        if i>=0:
            x+=arr1[i]
        if j>=0:
            x+=arr2[j]
            
        if x>=2:
            ans.append(x-2)
            c = -1
        elif x>=0:
            ans.append(x)
            c = 0
        else:
            ans.append(1)
            c = 1
        i-=1
        j-=1
        
    while len(ans)>1 and ans[-1]==0:
        ans.pop()
    return ans[::-1]



5/19 1079. 活字印刷

def numTilePossibilities(tiles):
    """
    :type tiles: str
    :rtype: int
    """
    from collections import Counter
    def dfs(cnt):
        ans = 0
        for i,x in cnt.items():
            if x>0:
                ans +=1
                cnt[i]-=1
                ans += dfs(cnt)
                cnt[i]+=1
        return ans
    cnt = Counter(tiles)
    return dfs(cnt)



5/20 1373. 二叉搜索子树的最大键值和

class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
def maxSumBST(root):
    """
    :type root: TreeNode
    :rtype: int
    """
    global ans
    ans = 0
    def dfs(node):
        global ans
        if node is None:
            return True,float("-inf"),float("inf"),0
        lbst,lmax,lmin,lsum = dfs(node.left)
        rbst,rmax,rmin,rsum = dfs(node.right)
        if lbst and rbst and lmax<node.val and rmin>node.val:
            s = lsum+rsum+node.val
            ans = max(ans,s)
            return True,max(rmax,node.val),min(lmin,node.val),s
        return False,0,0,0
    dfs(root)
    return ans



5/21 LCP 33. 蓄水

def storeWater(bucket, vat):
    """
    :type bucket: List[int]
    :type vat: List[int]
    :rtype: int
    """
    n = len(bucket)
    maxk = max(vat)
    if maxk==0:
        return 0
    ans = float("inf")
    for k in range(1,maxk+1):
        up = 0
        for i in range(n):
            up += max(0,(vat[i]+k-1)//k-bucket[i])
        ans=min(ans,up+k)
    return ans




举报

相关推荐

0 条评论