一、题目描述

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

二、解题思路

  1、思路1

  首先对数组进行排序,然后取出前k个数。排序方法可选用快速排序,时间复杂度为O(nl*ogn)。示例代码:

import java.util.ArrayList;
import java.util.Arrays;
public class Solution
{
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k)
{
        ArrayList<Integer> list=new ArrayList<>();
        if(input.length<k||k==0)
            return list;
        Arrays.sort(input);   
        for(int i=0;i<k;i++)
            list.add(input[i]);
        return list;
    }
}

  2、思路2

  首先将这堆数据中前k个数装入list,并找到这个k个数的最大数max(k),然后从第k+1个数开始向后找,如果有小于这个max(k)的,则替换掉这个数,然后重新这k个数中找出最大的max(k)。这样一直向后扫描。时间复杂度为O(k*n)。示例代码:

public class Solution_getLeastNumbers
{
public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k)
{
ArrayList<Integer> list = new ArrayList<Integer>(); if (input.length < k || k == 0)
return list; for (int i = 0; i < k; i++)
list.add(input[i]); for (int i = k; i < input.length; i++)
{
int j = this.getMax(list);
int temp = (Integer) list.get(j);
if (input[i] < temp)
list.set(j, input[i]);
}
return list;
}
public int getMax(ArrayList<Integer> list)
{
int max = list.get(0);
int j = 0;
for (int i = 0; i < list.size(); i++)
{
if (list.get(i) > max)
{
max = list.get(i);
j = i;
}
}
return j;
}
}

  3、思路3

  扫描数组,每遍找出最小的那个数,复杂度为O(k*n)。示例代码:

public ArrayList<Integer> GetLeastNumbers_Solution3(int[] input, int k)
{
ArrayList<Integer> list = new ArrayList<Integer>(); if (input.length < k || k == 0)
return list; for (int i = 0; i < input.length; i++)
list.add(input[i]); ArrayList<Integer> result=new ArrayList<>();
int num=0;
while(num<k)
{
int minNum=list.get(0);
for(int i=0;i<list.size();i++)
{
if(list.get(i)<minNum)
{
minNum=list.get(i);
}
}
list.remove((Object)minNum);
result.add(minNum);
num++;
}
return result;
}

  4、思路4

  先用数据中的前k个数建一个最大堆,建堆复杂度为O(k),然后从第k+1个数开始向后扫描,遇到小于堆顶元素时就替换掉堆定元素,更新堆,这个操作的复杂度为O(logk),总的时间复杂度为O(k+(n-k)*logk)=>O(n*logk)。示例代码:

  http://blog.csdn.net/zhiruchen/article/details/39120227

剑指offer面试题30:最小的k个数的更多相关文章

  1. 剑指Offer:面试题30——最小的k个数(java实现)

    问题描述: 输入n个整数,找出其中最小的k个数 思路1: 先排序,再取前k个 时间复杂度O(nlogn) 下面给出快排序的代码(基于下面Partition函数的方法) public void Quic ...

  2. 剑指offer 面试题40. 最小的k个数

    O(N)划分法,注意这个方法会改变原数据(函数参数是引用的情况下)!当然也可以再定义一个新容器对其划分 要求前k小的数,只要执行快排划分,每次划分都会把数据分成大小两拨.直到某一次划分的中心点正好在k ...

  3. 剑指Offer - 九度1371 - 最小的K个数

    剑指Offer - 九度1371 - 最小的K个数2013-11-23 15:45 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是 ...

  4. 剑指offer(29)最小的K个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题目分析 这题有两种方法来做. 第一种就是基于partition的 ...

  5. 【剑指Offer】29、最小的K个数

      题目描述:   输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4.   解题思路:   本题最直观的解法就是将输入的n个整数排 ...

  6. 面试题30.最小的k个数

    题目:输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8 这8个数字,则最小的四个数字为1,2,3,4, 这道题是典型的TopK问题,剑指Offer提供了两种方法来实现,一种方 ...

  7. 剑指offer——面试题30:包含min函数的栈

    #include"iostream" #include"stdio.h" using namespace std; ; ; template<typena ...

  8. 剑指offer面试题30.包含min函数的栈

    一开始写的垃圾代码,push和pop都是O(N) class Solution { public: vector<int> vec; int min_val=INT_MAX,min_cnt ...

  9. 【剑指Offer面试题】 九度OJ1371:最小的K个数

    题目链接地址: http://ac.jobdu.com/problem.php?pid=1371 题目1371:最小的K个数 时间限制:1 秒内存限制:32 兆特殊判题:否提交:5938解决:1265 ...

随机推荐

  1. 【转】Windows Phone 8 开发环境的搭建

    1.先安装Microsoft Visual Studio 2012旗舰版,安装包自己下载. 系统必须是Win8 X64 对于软硬件的检测可以参照: Windows Phone 8开发环境搭建之一.电脑 ...

  2. winform C#获得Mac地址,IP地址,子网掩码,默认网关

    1.添加程序集 2.引入命名空间 using System.Management; 3.方法 ManagementClass mc = new ManagementClass("Win32_ ...

  3. 最近一直在搞CAE,发现Eplan p8真的好强大。

    最近一直在搞CAE,发现Eplan p8真的好强大. 标准化的意义在与提高工作效率,减少重复. 标准化后,不容易出错,项目更改容易.事件都能及时跟踪.

  4. WIN8 下Cisco VPN连接 出现vpn 422 failed to enable virtual adapter错误

    今天在家用VPN软件连接,出现了“vpn 422 failed to enable virtual adapter”的错误,系统安装的是Win8专业版32位,百度了半天又很多方法解决不了,后来发现了一 ...

  5. 对Joint Training of Cascaded CNN for Face Detection一文的几点疑惑

    最近读了Joint Training of Cascaded CNN for Face Detection这篇论文,论文中把之前人脸检测使用到的cascade cnn,从分开训练的模式,改为了联合训练 ...

  6. asp.net中使用ueditor

    原文地址:http://blog.uoolo.com/Article/16 还有在MVC中使用ueditor:http://blog.uoolo.com/Article/111 最初百度了一下“编辑器 ...

  7. 为应用程序池 'DefaultAppPool' 提供服务的进程无法响应Ping

    打开Windows 2008 的事件查看器,应用警告提示: 为应用程序池 'DefaultAppPool' 提供服务的进程无法响应 Ping.进程 ID 是 '2144'. 注意: 需要重新注册一vb ...

  8. POJ 3903 Stock Exchange

    Stock Exchange Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2954   Accepted: 1082 De ...

  9. mysql查看和修改最大数量

    通常,mysql的最大连接数默认是100, 最大可以达到16384.1.查看最大连接数:show variables like '%max_connections%';2.修改最大连接数方法一:修改配 ...

  10. Vbox如何修改虚拟机器的uuid

    先是 X:   然后cd X:\Program Files\VirtualBox   然后是 VBoxManage internalcommands sethduuid "X:\Progra ...