【leetcode 第26场双周赛】前3题 Python解题思路

题不难也只能三题的选手在此。。打算刷题过程中遇到hard连题解都看着费劲的时候就pass。。

题目1 (5396. 连续字符):

给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。请你返回字符串的能量。
示例1:输入:s = “leetcode” 输出:2

解题思路:保存上一个遍历的字符及其连续长度

class Solution:
    def maxPower(self, s: str) -> int:
        if len(s)==1:
            return 1
        else:
            max_len=1
            cur_len=1
            last_char=s[0]
            for i in range(1,len(s)):
                if s[i]==last_char:
                    cur_len+=1
                    max_len=max(max_len,cur_len)
                else:
                    max_len=max(max_len,cur_len)
                    last_char=s[i]
                    cur_len=1
            return max_len

题目2(5397:最简分数):

给你一个整数 n ,请你返回所有 0 到 1 之间(不包括 0 和 1)满足分母小于等于 n 的 最简 分数 。分数可以以 任意 顺序返回。

解题思路:当分母等于n,可选分子为1至n-1,分子与分母可约分时则不是最简分数,所以判断候选分子与分母是否有公约数即可。

class Solution:
    def simplifiedFractions(self, n: int) -> List[str]:
        def is_gongyue(xx,yy):
            for j in range(2,xx+1):
                if xx%j==0:
                    if yy%j==0:
                        return 1
            if j==xx:
                return 0

        if n==1:
            return []
        else:    
            dict1=defaultdict(list)
            final=[]
            for pp in range(2,n+1):
                if pp==2:
                    dict1[pp]=["1/2"]
                elif pp==3:
                    dict1[pp]=["1/3","2/3"]
                else:
                    ans=[]
                    if pp%2==0: 
                        ans.append("1/"+str(pp))
                    else:
                        ans.append("1/"+str(pp))
                        ans.append("2/"+str(pp))
                    for i in range(3,pp):
                        if is_gongyue(i,pp):
                            continue
                        ans.append(str(i)+"/"+str(pp))
                    dict1[pp]=ans
                final=final+dict1[pp]
            return final

题目3(5398. 统计二叉树中好节点的数目):

给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。
「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。

解题思路:判断根节点到当前节点之间所有节点的最大值是否是当前节点的值。(总算知道咋用nonlocal了)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def goodNodes(self, root: TreeNode) -> int:
        max_val=root.val
        ans=0
        def dfs(node,max_val):
            nonlocal ans
            if node:
                if node.val==max(node.val,max_val):
                    ans+=1
                max_val=max(node.val,max_val)
                dfs(node.left,max_val)
                dfs(node.right,max_val)
            else:
                return
        dfs(root,max_val)
        return ans

你可能感兴趣的:(leetcode)