您的位置:首页 > Web前端

剑指offer-最小的k个数

2018-11-26 15:56 309 查看

题目描述

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

思路:排序,然后取前k个O(nlogn)

剑指解法:考虑之前的题目,数组中出现次数超过一半的数字,如果基于数组的第k个数字来调整,比其小的都位于左边,大的都位于右边。

方法一:基于划分的方法,查找第K个数字,第一次划分之后,划分的位置如果大于k,那么就在前面的子数组中继续进行划分,反之则在后面的子数组中继续划分

方法二:待续

# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        if tinput ==None or len(tinput)<k or len(tinput)<=0 or k<=0:
            return []
        n = len(tinput)
        start = 0
        end = n-1
        index = self.Partition(tinput,n,start,end)
        while index!= k-1:
            if index > k-1:
                end = index - 1
                index = self.Partition(tinput,n,start,end)
            else:
                start = index + 1
                index = self.Partition(tinput,n,start,end)
        output = tinput[:k]
        output.sort()
        return output
    def Partition(self,numbers,length,start,end):
        if numbers == None or length<=0 or start<0 or end>=length:
            return None
        if end==start:
            return end
        pivotvlue = numbers[start]
        leftmark = start + 1
        rightmark = end
        done = False
        while not done:
            while numbers[leftmark]<=pivotvlue and leftmark<=rightmark:
                leftmark +=1
            while numbers[rightmark]>=pivotvlue and rightmark>=leftmark:
                rightmark -=1
            if leftmark>rightmark:
                done = True
            else:
                numbers[leftmark],numbers[rightmark] = numbers[rightmark],numbers[leftmark]
        return rightmark
    方法一报错:啊啊啊啊啊啊啊啊啊啊啊啊啊

不通过

您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为42.86%

测试用例:
[4,5,1,6,2,7,3,8],1

对应输出应该为:

[1]

你的输出为:

[4]

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: