剑指offer全集详解python版——最小的K个数

题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

思路:

非常经典的题,一般是两种思路,快排或者堆(堆甚至有API)。

代码:

# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        if not tinput or k <= 0 or k > len(tinput):
            return []
        heap = Heap()
        for i in range(len(tinput)):
            if i <= k-1:
                heap.push(tinput[i])
            else:
                if heap.top() > tinput[i]:
                    heap.pop()
                    heap.push(tinput[i])
        return sorted(heap.heap)              
                     
                 
 
class Heap():
    def __init__(self):
        self.heap = []
 
    def top(self):
        return self.heap[0]
     
    def push(self, x):
        self.heap.append(x)
        self.swim(0, len(self.heap)-1)       
         
    def pop(self):
        self.heap[0], self.heap[-1] = self.heap[-1], self.heap[0]
        self.sink(0, len(self.heap)-2)
        return self.heap.pop()       
     
    def sink(self, low, high):
        i = low
        j = 2*i+1
        while j <= high:
            if j+1<=high and self.heap[j]<self.heap[j+1]:
                j+=1
            if self.heap[i] >= self.heap[j]:
                break
            self.heap[i], self.heap[j] = self.heap[j], self.heap[i]
            i = j
            j = 2*i+1
    def swim(self, low, high):
        j = high
        i = (j-1)/2
        while i >= low:
            if self.heap[i] >= self.heap[j]:
                break
            self.heap[i], self.heap[j] = self.heap[j], self.heap[i]
            j = i
            i = (j-1)/2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值