LeetCode(Python实现)——Easy部分【Day7】

88. 合并两个有序数组

问题描述:

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

 

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
 

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

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

解题思路:

  1. 理解题意,首先在代码注释中提到,不要返回任何值,在nums1本身上做修改。那么就意味着,我们需要将nums2插入到nums1中
  2. 我们可以将num1和nums2的前m位和前n位合并然后排序。但是时间复杂度为O((n+m)log(n+m)),且没有利用两个列表都是有序的这点
  3. 这里使用双指针 / 从后往前的方法。从后往前遍历nums1和nums2的前m位和前n位。如果nums2的第n个数字大于nums1的第m个数字,就将nums2的第n个数字放到nums1的最后一位上。
  4. nums2的第n个数字小于nums1的第m个数字,那么就将这个数字插入到nums1的该位处。因为传入的数字小,他的前一位是较大的,所以需要做一个置换
  5. 每次遍历,需要将m或者n减一,因为有序且已经填充过,所以不用再进行比较
  6. 如果当m遍历完,然而n还有剩余,那么说明nums2剩余的比nums1第一个都小,所以将nums2剩余的值插入到nums1最前面。
  7. leetcode上官方解法有动图演示,比我说的要清楚地多。表达能力弱,望谅解

代码实现:

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: None Do not return anything, modify nums1 in-place instead.
        """
        while m > 0 and n > 0:
            if nums2[n - 1] > nums1[m - 1]:
                nums1[m + n - 1] = nums2[n - 1]
                n -= 1
            else:
                nums1[m + n - 1] = nums2[n - 1]
                nums1[m + n - 1], nums1[m - 1] = nums1[m - 1], nums1[m + n - 1]
                m -= 1
        if m == 0 and n >0:
            nums1[:n] = nums2[:n]
    

100. 相同的树

问题描述:

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:       1         1
          / \       / \
         2   3     2   3

        [1,2,3],   [1,2,3]

输出: true
示例 2:

输入:      1          1
          /           \
         2             2

        [1,2],     [1,null,2]

输出: false
示例 3:

输入:       1         1
          / \       / \
         2   1     1   2

        [1,2,1],   [1,1,2]

输出: false

解题思路:

  1. 递归思想
  2. 首先考虑两个二叉树是否为空。如果都为空,返回True;如果一个为空,一个不为空,那不用,返回Flase。否则,先比较根节点是否相同。如果相同,再比较左节点是否相同,再比较右节点是否相同。如果都相同,则继续调用自身,继续比较下去,直到没有子节点为止

代码实现:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isSameTree(self, p, q):
        """
        :type p: TreeNode
        :type q: TreeNode
        :rtype: bool
        """
        if p is None and q is None:
            return True
        if p is not None and q is not None:
            return p.val == q.val and self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
        return False

101. 对称二叉树

问题描述:

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

 

例如,二叉树 [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
 

进阶:

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

解题思路:

  1. 和100题一样,都是递归思想。不同地方在于,比较的是节点的左节点和右节点是否相同。
  2. 这里定义一个辅助函数,来判断节点是否是对称的。参数为两个二叉树。

代码实现:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if root is None:
            return True
        return self.isRecu(root.left,root.right)

    def isRecu(self,left,right):
        if left is None and right is None:
            return True
        if left is None or right is None  or left.val != right.val:
            return False
        return self.isRecu(left.left,right.right) and self.isRecu(left.right,right.left)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值