129-134 这周的题是我后来补的

因为我最近生病 就是深恶痛绝的 颈椎病   背上都是麻的 所以 唉 艰难的人生唉。

129 :根节点到叶节点之和

简单题
前序遍历 往下遍历时 传入当前路径和 记得每层乘10

 

 

class Solution:
    def sumNumbers(self, root: TreeNode) -> int:
        rel = 0
        def preorder(root,num):
            nonlocal rel
            if (not root.left) and (not root.right):
                rel += (root.val + 10*num)
            if root.left:
                preorder(root.left,10*num + root.val)
            if root.right:
                preorder(root.right,10*num + root.val)
        preorder(root,0)
        return rel

 

 

130:被围绕的区域

本来早就写对了 结果却 把O全写成了零 醉醉醉

先设计一个访问数组VISITED
方法就是 看四条边上的'O' 从这些O出发访问连着的所有O 把他们访问标记置为1
最后遍历整个表 如果有'O' 没有被访问过 就改成X

 

 

        m = len(board)
        n = len(board[0])
        visited = [[0]* n for i in range(m)]
        def dfs(i,j):
            visited[i][j] = 1
            if i >0 and board[i-1][j] == 'O' and not visited[i-1][j]:
                dfs(i-1,j)
            if i < m-1 and board[i+1][j] == 'O' and not visited[i+1][j]:
                dfs(i+1,j)
            if j >0 and board[i][j-1] == 'O' and not visited[i][j-1]:
                dfs(i,j-1)
            if j < n-1 and board[i][j+1]== 'O' and not visited[i][j+1]:
                dfs(i,j+1)
        for j in range(n):
            if board[0][j] == 'O' and not visited[0][j]:
                dfs(0,j)
            if board[m-1][j] == 'O' and not visited[m-1][j]:
                dfs(m-1,j)
        for i in range(m):
            if board[i][0] == 'O' and not visited[i][0]:
                dfs(i,0)
            if board[i][n-1] == 'O' and not visited[i][n-1]:
                dfs(i,n-1)
        for i in range(1,m-1):
            for j in range(1,n-1):
                if board[i][j] == 'O' and not visited[i][j]:
                    board[i][j] = 'X'

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/surrounded-regions/solution/0-he-o-sha-sha-fen-bu-qing-chu-by-yizhu-oemoa/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

131:分割回文串

第一题是我自己想的办法哎  我好开心。

首先遍历一次S 做一个回文串列表 palind 这个列表比较复杂
palind[i] 里存放以i开始的回文串
palind[i][0] 里存放以i开始 且全部相同的回文串 比如'SSS' 'SS' 'S'
palind[i][1]里存放以i开始 存在不同字母的回文串 比如 'abba'
存放的不是回文串本身 而是回文串的开始和结束 比如【0,1】表示 s[0]单独一个字母。
如何做回文串列表呢 ?
先做最后一个字母 以他开始的只有一个 s[n-1 : n]
对于其他的字母 先看他是否可以组成相同字母回文串 就是palind[i+1][0]
再看 他与palind[i+1] 里所有的回文串 的后一个字母如果相同 那么他加上那个后面的字母 可以组成新的回文串。注意不要超过结尾
这样到第0位 就得到了上面所述的回文串列表
后面就是简单的回溯了
对于palind[0]中的每一个回文串 如果结尾不是n 就 从那个结尾继续回溯 如果结尾时n 就加入结果

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        n = len(s)
        palind = [[[],[]] for i in range(n)]
        palind[n-1] = [[[n-1,n]],[]]
        for i in range(n-2,-1,-1):
            palind[i][0].append([i,i+1])
            for each in palind[i + 1][0]:
                if s[i] == s[i+1]:
                    palind[i][0].append([i,each[1]])
                elif each[1] != n and s[i] == s[each[1]] :
                    palind[i][1] .append([i,each[1]+1])
            for each in palind[i+1][1]:
                if each[1] != n and s[i] == s[each[1]] :
                    palind[i][1] .append([i,each[1]+1])
            #操作过后 palind[i] 里就存放了所有以i开头的回文串。
        rel = []
        def dfs(start,curpath):
            for each in palind[start][0] + palind[start][1]:
                curpath.append(s[each[0]:each[1]])
                if each[1] != n:
                    dfs(each[1],curpath)
                else:
                    rel.append(curpath[:])
                curpath.pop()
        dfs(0,[])
        return rel

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/palindrome-partitioning/solution/rang-wo-po-you-cheng-jiu-gan-de-yi-dao-t-6efh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

132 回文串2  化身为CV工程师 不开心 

这个题太难了 。 

class Solution:
    def minCut(self, s: str) -> int:
        n = len(s)
        g = [[True] * n for _ in range(n)]

        for i in range(n - 1, -1, -1):
            for j in range(i + 1, n):
                g[i][j] = (s[i] == s[j]) and g[i + 1][j - 1]

        f = [float("inf")] * n
        for i in range(n):
            if g[0][i]:
                f[i] = 0
            else:
                for j in range(i):
                    if g[j + 1][i]:
                        f[i] = min(f[i], f[j] + 1)
        
        return f[n - 1]

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/palindrome-partitioning-ii/solution/cla-la-la-la-la-la-wo-shi-c-vgong-cheng-m1ekj/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

133 :克隆图 

创建了一大堆的辅助变量 

原来这种克隆题只需要建立原来结点和新节点的字典映射就可以了 

"""
# Definition for a Node.
class Node:
    def __init__(self, val = 0, neighbors = None):
        self.val = val
        self.neighbors = neighbors if neighbors is not None else []
"""

class Solution:
    def cloneGraph(self, node: 'Node') -> 'Node':
        if  not node:
            return node
        QUEUE = deque()
        nodedict = {}
 
        cnode = []
        i = 0
        QUEUE.append(node)
        while QUEUE:
            curNODE = QUEUE.popleft()
            newnode = Node(val=curNODE.val)
            cnode.append(newnode)
            nodedict[curNODE] = i
            i+= 1
            for each in curNODE.neighbors:
                if each in nodedict:
                    newnode.neighbors.append(cnode[nodedict[each]])
                    cnode[nodedict[each]].neighbors.append(newnode)
                elif each not in QUEUE:
                    QUEUE.append(each)
        return cnode[0]

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/clone-graph/solution/chuang-jian-liao-yi-da-dui-de-fu-zhu-bia-0l7m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

134: 加油站问题 

思路就是找最大段和嘛
如果油和超过了消费和 说明可以走通 否则不行

可以走通的情况下 不就是求哪一段的和最大嘛 简单题
CURSUM =往后加油-消耗 小于0就从新开始

答案和我思路不太一样  是考虑能不能走通的问题。

 

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        if sum(gas) < sum (cost):
            return -1
        n = len(gas)
        temp = [gas[i] - cost[i] for i in range(n)]
        cursum = 0
        maxsum = -1
        curindex = 0
        for index in range(2*n):
            cursum += temp[index%n]
            if cursum< 0:
                cursum = 0
                curindex = index+1
            if cursum > maxsum:
                maxsum = cursum
                maxindex = curindex
        return maxindex

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/gas-station/solution/ahahahahyi-ci-ti-jiao-jiu-guo-liao-kai-x-gzb2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2022-01-15 19:12  yi术家  阅读(26)  评论(0编辑  收藏  举报