Python每日一练(20230502) 围绕区域、两数之和、二叉树展开

简介: Python每日一练(20230502) 围绕区域、两数之和、二叉树展开

1. 被围绕的区域


给你一个 m x n 的矩阵 board ,由若干字符 'X''O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O''X' 填充。


示例 1:

5a3a22bfad68fd1d22012a0ee48ec665.jpeg


输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]

输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]

解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。


示例 2:

输入:board = [["X"]]

输出:[["X"]]


提示:

   m == board.length

   n == board[i].length

   1 <= m, n <= 200

   board[i][j] 为 'X' 或 'O'


出处:

https://edu.csdn.net/practice/26945724

代码:

from typing import List
class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        if not board or len(board) == 0:
            return
        m = len(board)
        n = len(board[0])
        from collections import deque
        queue = deque()
        for i in range(m):
            if board[i][0] == "O":
                queue.append((i, 0))
            if board[i][n - 1] == "O":
                queue.append((i, n - 1))
        for j in range(n):
            if board[0][j] == "O":
                queue.append((0, j))
            if board[m - 1][j] == "O":
                queue.append((m - 1, j))
        while queue:
            x, y = queue.popleft()
            board[x][y] = "M"
            for nx, ny in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:
                if 0 <= nx < m and 0 <= ny < n and board[nx][ny] == "O":
                    queue.append((nx, ny))
        for i in range(m):
            for j in range(n):
                if board[i][j] == "O":
                    board[i][j] = "X"
                if board[i][j] == "M":
                    board[i][j] = "O"
#%%
s = Solution()
board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]
s.solve(board)
print(board)

输出:

[['X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X'], ['X', 'O', 'X', 'X']]


2. 两数之和 II


给定一个已按照 非递减顺序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。


函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。


你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。


示例 1:

输入:numbers = [2,7,11,15], target = 9

输出:[1,2]

解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。


示例 2:

输入:numbers = [2,3,4], target = 6

输出:[1,3]


示例 3:

输入:numbers = [-1,0], target = -1

输出:[1,2]


提示:

   2 <= numbers.length <= 3 * 10^4

   -1000 <= numbers[i] <= 1000

   numbers 按 非递减顺序 排列

   -1000 <= target <= 1000

   仅存在一个有效答案


出处:

https://edu.csdn.net/practice/26945725

代码:

class Solution(object):
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        d = {}
        size = 0
        while size < len(numbers):
            if not numbers[size] in d:
                d[numbers[size]] = size + 1
            if target - numbers[size] in d:
                if d[target - numbers[size]] < size + 1:
                    answer = [d[target - numbers[size]], size + 1]
                    return answer
            size = size + 1
#%%
s = Solution()
print(s.twoSum(numbers = [2,7,11,15], target = 9))
print(s.twoSum(numbers = [2,3,4], target = 6))
print(s.twoSum(numbers = [-1,0], target = -1))

输出:

[1, 2]

[1, 3]

[1, 2]


3. 二叉树展开为链表


给你二叉树的根结点 root ,请你将它展开为一个单链表

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例 1:

92075cab0821ae4b0edf18d3de9db0f1.jpeg



输入:root = [1,2,5,3,4,null,6]

输出:[1,null,2,null,3,null,4,null,5,null,6]


示例 2:

输入:root = []

输出:[]


示例 3:

输入:root = [0]

输出:[0]


提示:

   树中结点数在范围 [0, 2000] 内

   -100 <= Node.val <= 100


进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?

出处:

https://edu.csdn.net/practice/26945726

代码:

class TreeNode(object):
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None
class Solution:
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        while root != None:
            if root.left == None:
                root = root.right
            else:
                pre = root.left
                while pre.right != None:
                    pre = pre.right
                pre.right = root.right
                root.right = root.left
                root.left = None
                root = root.right
def listToTree(lst):
    if not lst:
        return None
    root = TreeNode(lst[0])
    queue = [root]
    i = 1
    while i < len(lst):
        node = queue.pop(0)
        if i<len(lst) and lst[i] is not None:
            node.left = TreeNode(lst[i])
            queue.append(node.left)
        i += 1
        if i<len(lst) and lst[i] is not None:
            node.right = TreeNode(lst[i])
            queue.append(node.right)
        i += 1
    return root
def preorderTraversal(root: TreeNode):
    res = []
    if not root:
        return res
    res.append(root.val)
    res.extend(preorderTraversal(root.left))
    res.extend(preorderTraversal(root.right))
    return res
s = Solution()
null = None
nums = [1,2,5,3,4,null,6]
root = listToTree(nums)
s.flatten(root)
print(preorderTraversal(root))

输出:

[1, 2, 3, 4, 5, 6]

目录
相关文章
|
1月前
|
人工智能 机器人 测试技术
【python】两数之和 python实现(详细讲解)
【python】两数之和 python实现(详细讲解)
|
8天前
|
存储 算法 Python
python常用算法(5)——树,二叉树与AVL树(一)
python常用算法(5)——树,二叉树与AVL树
|
23天前
|
存储 算法 Java
【经典算法】LeetCode1:两数之和(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode1:两数之和(Java/C/Python3实现含注释说明,Easy)
14 1
|
8天前
|
存储 算法 Shell
python常用算法(5)——树,二叉树与AVL树(三)
python常用算法(5)——树,二叉树与AVL树
|
8天前
|
算法 Python
python常用算法(5)——树,二叉树与AVL树(二)
python常用算法(5)——树,二叉树与AVL树
|
18天前
|
SQL 算法 数据可视化
LeetCode题目99:图解中叙遍历、Morris遍历实现恢复二叉树搜索树【python】
LeetCode题目99:图解中叙遍历、Morris遍历实现恢复二叉树搜索树【python】
|
18天前
|
存储 算法 数据可视化
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
|
19天前
|
存储 SQL 数据挖掘
LeetCode 第一题:两数之和 【1/1000 python】
LeetCode 第一题:两数之和 【1/1000 python】
|
1月前
|
Python 人工智能
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
62 1
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
|
1月前
|
Python
使用python写一个二叉树
使用python写一个二叉树
28 1