剑指offer——知识迁移能力(一)

面试题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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值