1. 程式人生 > >劍指offer系列——二叉搜尋樹的第k個結點,資料流的中位數,滑動視窗的最大值

劍指offer系列——二叉搜尋樹的第k個結點,資料流的中位數,滑動視窗的最大值

二叉搜尋樹的第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