劍指offer系列——二叉搜尋樹的第k個結點,資料流的中位數,滑動視窗的最大值
阿新 • • 發佈:2018-11-11
二叉搜尋樹的第k個結點
題目描述
給定一棵二叉搜尋樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。
解題思路:
二叉搜尋樹中序遍歷就能排好序,所以中序遍歷到第k個結點就是第k小的結點。
程式碼:
# -*- 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 global result #必須全域性變數 result = [] middle = self.minorder(pRoot) if k<=0 or len(middle)<k: return None else: return middle[k-1] def minorder(self, pRoot): if not pRoot: return [] self.minorder(pRoot.left) result.append(pRoot) self.minorder(pRoot.right) return result
資料流的中位數
題目描述
如何得到一個數據流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用Insert()方法讀取資料流,使用GetMedian()方法獲取當前讀取資料的中位數。
程式碼:
# -*- coding:utf-8 -*- class Solution: def __init__(self): self.array = [] def Insert(self, num): # write code here self.array.append(num) self.array.sort() def GetMedian(self,array): # write code here length = len(self.array) if length%2==0: return (self.array[length/2]+self.array[length/2-1])/2.0 else: return self.array[length/2]
滑動視窗的最大值
題目描述
給定一個數組和滑動視窗的大小,找出所有滑動窗口裡數值的最大值。例如,如果輸入陣列{2,3,4,2,6,2,5,1}及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為{4,4,6,6,6,5}; 針對陣列{2,3,4,2,6,2,5,1}的滑動視窗有以下6個: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
解題思路:
陣列長度-視窗大小=滑動視窗數目
程式碼:
# -*- coding:utf-8 -*-
class Solution:
def maxInWindows(self, num, size):
# write code here
length = len(num)
if size<=0 or size>length:
return []
result = []
for i in range(length-size+1):
result.append(max(num[i:i+size]))
return result