python leetcode 431-440

# 433
class Solution:
    def minMutation(self, start: str, end: str, bank: List[str]) -> int:
        bank = set(bank)
        if end not in bank:
            return -1
        change_map = {
            "A": "CGT",
            "C": "AGT",
            "G": "CAT",
            "T": "CGA",
        }
        min_count = len(bank) + 1
        def dfs(current, count, current_bank):
            nonlocal min_count
            # terminator
            if count > min_count:
                return
            if current == end:
                if count < min_count:
                    min_count = count
                return
            if not current_bank:
                return
            # process
            for i, s in enumerate(current):
                for char in change_map[s]:
                    new = current[:i] + char + current[i + 1:]
                    if new not in current_bank:
                        continue
                    current_bank.remove(new)
                    # drill down
                    dfs(new, count + 1, current_bank)

                    # reverse state
                    current_bank.add(new)
        dfs(start, 0, bank)
        return min_count if min_count <= len(bank) else -1
# 434
class Solution:
    def countSegments(self, s: str) -> int:
        return len(s.split())
# 435 
class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key = lambda x : x[1])
        cur_end , num = float('-inf') , 0
        for start , end in intervals:
            if start >= cur_end:
                num += 1
                cur_end = end
        return len(intervals) - num
# 436
class Solution:
    def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
        n = len(intervals)
        starts, ends = list(zip(*intervals))
        starts = sorted(zip(starts, range(n)))
        ends = sorted(zip(ends, range(n)))

        ans, j = [-1] * n, 0
        for end, id in ends:
            while j < n and starts[j][0] < end:
                j += 1
            if j < n:
                ans[id] = starts[j][1]
        return ans
# 437
class Solution:
    def pathSum(self, root: TreeNode, targetSum: int) -> int:
        def rootSum(root, targetSum):
            if root is None:
                return 0

            ret = 0
            if root.val == targetSum:
                ret += 1

            ret += rootSum(root.left, targetSum - root.val)
            ret += rootSum(root.right, targetSum - root.val)
            return ret
        
        if root is None:
            return 0
            
        ret = rootSum(root, targetSum)
        ret += self.pathSum(root.left, targetSum)
        ret += self.pathSum(root.right, targetSum)
        return ret
# 438
class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        S = [0] * 26
        P = [0] * 26
        ans = []

        if len(s) < len(p):
            return ans
        for i in range(len(p)):
            P[ord(p[i]) - 97] += 1
            S[ord(s[i]) - 97] += 1
        if S == P:
            ans.append(0)
        for i in range(len(s) - len(p)):
            S[ord(s[i + len(p)]) - 97] += 1
            S[ord(s[i]) - 97] -= 1

            if S == P:
                ans.append(i + 1)

        return ans

0 0 突然想回来更新了 别问为什么 但是会员没有了 也不想做困难题 只做免费的简单中等题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值