177. 把排序数组转换为高度最小的二叉搜索树
题目
给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树。
注意事项
There may exist multiple valid solutions, return any of them.
样例
给出数组 [1,2,3,4,5,6,7], 返回
4
/ \
2 6
/ \ / \
1 3 5 7
思路
- 二叉排序树:若它的左子树上的所有节点的值均小于它的根节点的值;若它的右子树上的所有节点的值均大于于它的根节点值
- 思路:对已排序的数组得到中间值,然后分左右树,然后对左右树也是一样,找到中间值,分左右树。
- 注意的是每次得到的中间值都需要建立树,然后对其设置左右树
代码
"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
"""
class Solution:
"""
@param: A: an integer array
@return: A tree node
"""
def sortedArrayToBST(self, A):
# write your code here
if A is None :return None
result = self.lala(A,0,len(A)-1)
return result
def lala(self,A,x,y):
if A is None:return None
root = None
if x < y:
mid = (x+y)//2
root = TreeNode(A[mid])
root.left = self.lala(A,x,mid-1)
root.right = self.lala(A,mid+1,y)
if x == y:
root = TreeNode(A[x])
return root
156. 合并区间
题目
给出若干闭合区间,合并所有重叠的部分。
样例
给出的区间列表 => 合并后的区间列表:
[ [
[1, 3], [1, 6],
[2, 6], => [8, 10],
[8, 10], [15, 18]
[15, 18] ]
]
思路
- 本题给出的区间列表,每一行是左边用x.start,右边用x.end取值。
- 先按intervals.start排序
- 对排完序的区间进行判断是否重叠,则判断下一个区间的左边是否大于当下区间的右边。
- 若有重叠(小于),则左边不变,右边=max(当下区间右边,下一个区间右边)
- 没有重叠,则当下区间与下面的区间都不可能重叠,则将结果存储,指向下一个区间,循环第二步。
- 5.
代码
在列表操作
class Solution:
"""
@param: intervals: interval list.
@return: A new interval list.
"""
def merge(self, intervals):
# write your code here
a=[]
#按着[x][0]排序,并将其转为列表
for i in sorted(intervals,key = lambda i:i.start):
a.append([i.start,i.end])
if a == []:return a
#对排好序的进行包含区间
b = a[0][0]
c = a[0][1]
result = []
for i in range(1,len(a)):
if a[i][0]<=c :
#若两个区间刚好有重叠,则右边取max(两个区间右边)
c=max(c,a[i][1])
else:
#若下一个区间的左边比当下区间的右边还要大,则当下区间与后面的所有区间都不可能重合
#将结果保存在result
#并当下区间更改为下一个区间
result.append([b,c])
b = a[i][0]
c = a[i][1]
result.append([b,c])
return result
直接操作
class Solution:
"""
@param: intervals: interval list.
@return: A new interval list.
"""
def merge(self, intervals):
# write your code here
out = []
for i in sorted(intervals , key =lambda i:i.start):
#每次都判断是否当下区间的右边比下一个区间的左边还要小(是否重叠)
#小则代表不会与下面的其他区间重叠
#大则表示两个区间有重叠,将进行合并,而右边取max(两个区间右边)
if out and i.start <=out[-1].end:
out[-1].end = max(out[-1].end,i.end)
else:
out.append(i)
return out