剑指offer 面试题40 python版+解析:最小的K个数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mabozi08/article/details/88863134

题目描述

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

思路:当可以修改输入数组的时候,可以采用时间复杂度为O(n)的算法

采用快速排序的思路。如果基于数组的第K个数字来调整,则使得比K个数字小的所有数字都位于数组的左边,大的都位于右边。调整后,位于数组中左边的K个数字就是最小的K个数字。

# -*- coding:utf-8 -*-
import random
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        if not input or k<=0 or k>len(tinput):
            return []
        output = []
        start = 0
        end = len(tinput)-1
        index = self.Partition(tinput, len(tinput), start, end)
        while (index!=k-1):
            if index>k-1:
                end = index-1
                index = self.Partition(tinput, len(tinput), start, end)
            else:
                start = index+1
                index = self.Partition(tinput, len(tinput), start, end)
        for i in range(0,k):
            output.append(tinput[i])
        return sorted(output)
    def Partition(self, data, length, start, end):
        if not data:
            return None
        index = random.randint(start, end)
        data[index], data[end] = data[end], data[index]
        small = start - 1
        for i in range(start,end):
            if data[i]<data[end]:
                small+=1
                if small!=i:
                    data[i], data[small] = data[small], data[i]
        small+=1
        data[small], data[end] = data[end], data[small]
        return small

猜你喜欢

转载自blog.csdn.net/mabozi08/article/details/88863134
今日推荐