面试题53:在排序数组中查找数字
题目一:数字在排序数组中出现的次数
- 题目描述
统计一个数字在排序数组中出现的次数。
- 详细代码
# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
num = 0
if data and len(data) > 0:
length = len(data)
first = self.GetFirstK(data, k, 0, length - 1)
last = self.GetLastK(data, k, length, 0, length - 1)
if first > -1 and last > -1:
num = last - first + 1
return num
def GetFirstK(self, data, k, start, end):
if start > end:
return -1
midIndex = (start + end) // 2
midValue = data[midIndex]
if midValue == k:
if midIndex == 0 or (midIndex > 0 and data[midIndex - 1] != k):
return midIndex
else:
end = midIndex - 1
elif midValue > k:
end = midIndex - 1
else:
start = midIndex + 1
return self.GetFirstK(data, k, start, end)
def GetLastK(self, data, k, length, start, end):
if start > end:
return -1
midIndex = (start + end) // 2
midValue = data[midIndex]
if midValue == k:
if midIndex == length - 1 or (midIndex < length - 1 and data[midIndex + 1] != k):
return midIndex
else:
start = midIndex + 1
elif midValue > k:
end = midIndex - 1
else:
start = midIndex + 1
return self.GetLastK(data, k, length, start, end)
题目二:0到n-1中缺失的数字
- 题目描述
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内,在范围0到n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
- 详细代码
# -*- coding:utf-8 -*-
class Solution:
def GetMissingNum(self, data):
if not data or len(data) <= 0:
return -1
length = len(data)
start = 0
end = length - 1
while start <= end:
mid = (start + end) // 2
if mid != data[mid]:
if mid == 0 or data[mid - 1] == mid - 1:
return mid
else:
end = mid - 1
else:
start = mid + 1
if start == length:
return length
return -1
题目三:数组中数值和下标相等的元素
- 题目描述
假设一个挡掉递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{-3,-1,1, 3,5}中,数字3和他的下标相等。
- 详细代码
# -*- coding:utf-8 -*-
class Solution:
def GetNumSameAsIndex(self, data):
if not data or len(data) <= 0:
return -1
length = len(data)
start = 0.
end = length - 1
while start <= end:
mid = (start + end ) // 2
if mid == data[mid]:
return mid
elif mid > data[mid]:
start = mid + 1
else:
end = mid - 1
return -1
面试题54:二叉搜索树的第K大节点
- 题目描述
给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
- 详细代码
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回对应节点TreeNode
def KthNode(self, pRoot, k):
# write code here
if not pRoot or k <= 0:
return None
res = []
def inOrder(pRoot):
if not pRoot:
return []
inOrder(pRoot.left)
res.append(pRoot)
inOrder(pRoot.right)
inOrder(pRoot)
if len(res) < k:
return None
return res[k - 1]
面试题55:二叉树的深度
题目一:二叉树的深度
- 题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
- 详细代码
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def TreeDepth(self, pRoot):
# write code here
if not pRoot:
return 0
left = self.TreeDepth(pRoot.left)
right = self.TreeDepth(pRoot.right)
return max(left, right) + 1
题目二:平衡二叉树
- 题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
- 详细代码
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def IsBalanced_Solution(self, pRoot):
# write code here
flag, depth = self.IsBalancedCore(pRoot)
return flag
def IsBalancedCore(pRoot):
if not pRoot:
return True, 0
left, depth_left = self.IsBalancedCore(pRoot.left)
right, depth_right = self.IsBalancedCore(pRoot.right)
if left and right:
dif = depth_left - depth_right
if abs(dif) <= 1:
depth = depth_left
if dif < 0:
depth = depth_right
return True, depth + 1
return False, 0