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]
解题思路:
理解题意,首先在代码注释中提到,不要返回任何值,在nums1本身上做修改。那么就意味着,我们需要将nums2插入到nums1中 我们可以将num1和nums2的前m位和前n位合并然后排序。但是时间复杂度为O((n+m)log(n+m)),且没有利用两个列表都是有序的这点 这里使用双指针 / 从后往前的方法。从后往前遍历nums1和nums2的前m位和前n位。如果nums2的第n个数字大于nums1的第m个数字,就将nums2的第n个数字放到nums1的最后一位上。 nums2的第n个数字小于nums1的第m个数字,那么就将这个数字插入到nums1的该位处。因为传入的数字小,他的前一位是较大的,所以需要做一个置换 每次遍历,需要将m或者n减一,因为有序且已经填充过,所以不用再进行比较 如果当m遍历完,然而n还有剩余,那么说明nums2剩余的比nums1第一个都小,所以将nums2剩余的值插入到nums1最前面。 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
解题思路:
递归思想 首先考虑两个二叉树是否为空。如果都为空,返回True;如果一个为空,一个不为空,那不用,返回Flase。否则,先比较根节点是否相同。如果相同,再比较左节点是否相同,再比较右节点是否相同。如果都相同,则继续调用自身,继续比较下去,直到没有子节点为止
代码实现:
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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
解题思路:
和100题一样,都是递归思想。不同地方在于,比较的是节点的左节点和右节点是否相同。 这里定义一个辅助函数,来判断节点是否是对称的。参数为两个二叉树。
代码实现:
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)