一、题目描述

  输入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. Porter/Duff,图片加遮罩setColorFilter

    同步发表于http://avenwu.net/2015/02/03/porterduff Fork on github https://github.com/avenwu/support 经常会遇到给 ...

  2. github 使用记录

    安装客户端tortoiseGit 是服务端,要想在自己电脑上使用git我们还需要一个git客户端,我这里选用TortoiseGit,他给我们提供了图形界面的操作.在安装之前首先需要安装git,下载地址 ...

  3. C#导出EXCEL的几种方法

    using System; using System.Collections.Generic; using System.Text; using System.Data; using System.W ...

  4. Android之 -WebView实现离线缓存阅读

    前言 本篇博客要实现的是一个离线下载和离线阅读的功能,这是很多阅读类app都常见的一个功能,典型的应用就是网易新闻.什么是离线下载?其实这个概念是比较模糊,是离线之后下载呢,还是下载之后离线,但稍微有 ...

  5. Fabric自动部署太方便了

    之前不知道有Fabric工具,每次发布程序到服务器上的时候,基本流程:本地打包程序 -> Ftp上传 -> 停服务器Apache -> 覆盖文件 -> 启动Apache, 非常 ...

  6. url rewrite

    http://www.microsoft.com/taiwan/technet/iis/expand/URLRewrite.aspx http://www.iis.net/learn/extensio ...

  7. 几种在Linux下查询外网IP的办法

    原文地址:http://my.oschina.net/epstar/blog/513186 Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl ...

  8. CGAL4.4+VC2008编译

    一: CGAL是欧盟资助的基础几何库,很底层, 纯算法, 对于你的项目和科研都是不可多得的好东西, 废话一句, 国内做这样的东西, 估计会活不下去交不了差的. 不多介绍.送上 英文原址, 从软件角度, ...

  9. 终于找到全annotation配置springMVC的方法了(事务不失效)

    如果带上事务,那么用annotation方式的事务注解和bean配置,事务会失效,要将service bean配置到xml文件中才行 这个问题是由于问答上有解决方案 引用 这个问题很经典了 在主容器中 ...

  10. Fiddler捕捉ASP.NET WebSite调用WebService、WCF服务

    Fiddler默认会注册一个代理,有时会发现WebSite调用的WebService或者WCF服务无法被捕捉到.其实是由于运行的站点关联的应用程序池使用的账号和我们当前登陆操作系统的用户不同,自然它们 ...