Python每日一练(20230402) 对称二叉树、全排列、盛最多水的容器

简介: Python每日一练(20230402) 对称二叉树、全排列、盛最多水的容器

1. 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

   1

  / \

 2   2

/ \ / \

3  4 4  3


但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

   1

  / \

 2   2

  \   \

   3   3


进阶:

你可以运用递归和迭代两种方法解决这个问题吗?

出处:

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

代码1: 递归

class TreeNode:
     def __init__(self, x):
         self.val = x
         self.left = None
         self.right = None
class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        def judge(left, right):
            if not left and not right:
                return True
            elif not left or not right:
                return False
            else:
                return left.val == right.val and judge(left.right, right.left) and judge(left.left, right.right)
        return judge(root, root)
def listToTree(lst: list) -> TreeNode:
    if not lst:
        return None
    root = TreeNode(lst[0])
    queue = [root]
    i = 1
    while i < len(lst):
        node = queue.pop(0)
        if 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
if __name__ == '__main__':
    s = Solution()
    nums = [1,2,2,3,4,4,3]
    root = listToTree(nums)
    print(s.isSymmetric(root))
    null = None
    nums = [1,2,2,null,3,null,3]
    root = listToTree(nums)
    print(s.isSymmetric(root))

输出:

True

False

代码2: 递归

class TreeNode:
     def __init__(self, x):
         self.val = x
         self.left = None
         self.right = None
class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True
        queue = [root.left, root.right]
        while queue:
            left = queue.pop(0)
            right = queue.pop(0)
            if not left and not right:
                continue
            if not left or not right or left.val != right.val:
                return False
            queue.append(left.left)
            queue.append(right.right)
            queue.append(left.right)
            queue.append(right.left)
        return True
def listToTree(lst: list) -> TreeNode:
    if not lst:
        return None
    root = TreeNode(lst[0])
    queue = [root]
    i = 1
    while i < len(lst):
        node = queue.pop(0)
        if 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
if __name__ == '__main__':
    s = Solution()
    nums = [1,2,2,3,4,4,3]
    root = listToTree(nums)
    print(s.isSymmetric(root))
    null = None
    nums = [1,2,2,null,3,null,3]
    root = listToTree(nums)
    print(s.isSymmetric(root))

输出:

True

False


2. 输出整数的全排列

输入整数n(3<=n<=7),编写程序输出1,2,....,n整数的全排列,按字典序输出。

输入样例:

输入:3

输出:123 132 213 231 312 321

出处:

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

代码:

import random
n = int(input())
t = list()
t1 = set()
for i in range(1,n+1):
    t.append(str(i))
while True:
    sum = 1
    for i in range(1, n + 1):
        sum *= i
    if len(t1) >= sum:
        break
    random.shuffle(t)
    t1.add("".join(t))
s = sorted(t1)
for i in s:
    print(i,end=" ")

输入输出:

3

123 132 213 231 312 321


3. 盛最多水的容器

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai)(i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。

示例 1:

输入:[1,8,6,2,5,4,8,3,7]

输出:49

解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]

输出:1

示例 3:

输入:height = [4,3,2,1,4]

输出:16

示例 4:

输入:height = [1,2,1]

输出:2


提示:

  • n = height.length
  • 2 <= n <= 3 * 10^4
  • 0 <= height[i] <= 3 * 10^4

出处:

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

代码1:

from typing import List
class Solution:
    def maxArea(self, height: List[int]) -> int:
        N = len(height)
        i = 0
        j = N-1
        max_area = 0
        while i < j:
            c = (j-i)*min(height[i], height[j])
            if c > max_area:
                max_area = c
            if height[i] > height[j]:
                j -= 1
            else:
                i += 1
        return max_area
# %%
s = Solution()
print(s.maxArea([1,8,6,2,5,4,8,3,7]))
print(s.maxArea([1,1]))
print(s.maxArea([4,3,2,1,4]))
print(s.maxArea([1,2,1]))

输出:

49

1

16

2

代码2:

from typing import List
class Solution:
    def maxArea(self, height: List[int]) -> int:
        n = len(height)
        ans = 0
        for i in range(n):
            for j in range(i + 1, n):
                area = min(height[i], height[j]) * (j - i)
                ans = max(ans, area)
        return ans
# %%
s = Solution()
print(s.maxArea([1,8,6,2,5,4,8,3,7]))
print(s.maxArea([1,1]))
print(s.maxArea([4,3,2,1,4]))
print(s.maxArea([1,2,1]))

代码3:

from typing import List
class Solution:
    def maxArea(self, height: List[int]) -> int:
        n = len(height)
        ans = 0
        i, j = 0, n - 1
        while i < j:
            area = min(height[i], height[j]) * (j - i)
            ans = max(ans, area)
            if height[i] < height[j]:
                i += 1
            else:
                j -= 1
        return ans
# %%
s = Solution()
print(s.maxArea([1,8,6,2,5,4,8,3,7]))
print(s.maxArea([1,1]))
print(s.maxArea([4,3,2,1,4]))
print(s.maxArea([1,2,1]))

🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/


目录
相关文章
|
5月前
|
存储 索引 Python
Python基础第五篇(Python数据容器)
Python基础第五篇(Python数据容器)
|
2月前
|
存储 索引 Python
python中的数据容器
python中的数据容器
|
3月前
|
存储 Kubernetes Cloud Native
探索Python编程的奥秘云原生时代的容器编排:Kubernetes入门与实践
【8月更文挑战第30天】本文以浅显易懂的方式,探讨了Python编程的核心概念和技巧。从基础语法到高级特性,再到实际应用案例,逐步引导读者深入理解Python编程的精髓。通过本文的学习,读者将能够掌握Python编程的基本技能,并激发进一步探索的兴趣。
40 13
|
3月前
|
运维 数据安全/隐私保护 Docker
深入浅出Python装饰器《Docker容器化技术在运维中的应用与实践》
【8月更文挑战第29天】装饰器在Python中是一个强大而神秘的存在,它能够轻松地改变一个函数的行为而不修改其源代码。本文将通过浅显易懂的语言和生动的比喻,带你一步步揭开装饰器的神秘面纱,从基本概念到实际应用,让你轻松掌握这一魔法般的工具。
|
3月前
|
Kubernetes 持续交付 Docker
Python进行容器化应用开发
【8月更文挑战第13天】随着云计算和微服务架构的发展,容器化已成为现代应用开发的关键部分。Docker和Kubernetes是最流行的容器化工具。本文通过Python示例展示如何构建、运行容器化应用,并使用Kubernetes进行部署。首先介绍如何用Docker容器化一个简单的Flask应用,接着演示如何通过Kubernetes YAML文件定义和管理应用部署和服务。最后,探讨了使用Python与Docker及Kubernetes集成的最佳实践,包括自动化测试、持续集成、微服务架构和容器编排。
26 1
|
3月前
|
Python 容器
【Leetcode刷题Python】11. 盛最多水的容器
解决LeetCode "盛最多水的容器" 问题的Python实现代码,使用了双指针的方法来找出能够容纳最多水的两条线。代码中定义了两个指针i和j,分别从数组的两端向中间遍历,通过计算两个指针所指高度的较小值与它们之间的距离的乘积来更新最大面积res。
28 0
|
3月前
|
网络安全 开发工具 git
python在容器内克隆拉取git私有仓库
python在容器内克隆拉取git私有仓库
|
3月前
|
Python
【Leetcode刷题Python】46. 全排列
本文介绍了LeetCode题目46的Python编程解决方案,题目要求给定一个不含重复数字的数组,返回该数组所有可能的全排列。
23 0
|
5月前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
6月前
|
存储 索引 Python
Python数据容器的切片操作详解
Python数据容器的切片操作详解
51 1