剑指offer面试题30:最小的k个数
一、题目描述
输入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个数的更多相关文章
- 剑指Offer:面试题30——最小的k个数(java实现)
问题描述: 输入n个整数,找出其中最小的k个数 思路1: 先排序,再取前k个 时间复杂度O(nlogn) 下面给出快排序的代码(基于下面Partition函数的方法) public void Quic ...
- 剑指offer 面试题40. 最小的k个数
O(N)划分法,注意这个方法会改变原数据(函数参数是引用的情况下)!当然也可以再定义一个新容器对其划分 要求前k小的数,只要执行快排划分,每次划分都会把数据分成大小两拨.直到某一次划分的中心点正好在k ...
- 剑指Offer - 九度1371 - 最小的K个数
剑指Offer - 九度1371 - 最小的K个数2013-11-23 15:45 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是 ...
- 剑指offer(29)最小的K个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题目分析 这题有两种方法来做. 第一种就是基于partition的 ...
- 【剑指Offer】29、最小的K个数
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 解题思路: 本题最直观的解法就是将输入的n个整数排 ...
- 面试题30.最小的k个数
题目:输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8 这8个数字,则最小的四个数字为1,2,3,4, 这道题是典型的TopK问题,剑指Offer提供了两种方法来实现,一种方 ...
- 剑指offer——面试题30:包含min函数的栈
#include"iostream" #include"stdio.h" using namespace std; ; ; template<typena ...
- 剑指offer面试题30.包含min函数的栈
一开始写的垃圾代码,push和pop都是O(N) class Solution { public: vector<int> vec; int min_val=INT_MAX,min_cnt ...
- 【剑指Offer面试题】 九度OJ1371:最小的K个数
题目链接地址: http://ac.jobdu.com/problem.php?pid=1371 题目1371:最小的K个数 时间限制:1 秒内存限制:32 兆特殊判题:否提交:5938解决:1265 ...
随机推荐
- java项目中读取properties文件
这里的配置文件都放在src下面, System.properties的内容 exceptionMapping=exceptionMapping.properties config=config.pro ...
- SecureCRT的快捷键
快捷键,有时比笨拙的方式,要效率高很多,近期经常和Linux打交道,用到SecureCRT,这里就从网上找到部分快捷方式,作为日后查看,以防经常查找. Alt + Enter -- 全屏Alt + B ...
- windows 应用商店应用笔记
xaml http://www.cnblogs.com/free722/archive/2011/11/06/2238073.html win8 http://blog.csdn.net/ygzk12 ...
- android OOM分析工具LeakCanary
http://my.oschina.net/u/255456/blog/523659?fromerr=oGosxKBf LeakCanary 只是探测到可能出现内存泄露,然后dump 一个java h ...
- [Compose] 21. Apply Natural Transformations in everyday work
We see three varied examples of where natural transformations come in handy. const Right = x => ( ...
- ExtJs 可查询的下拉框
最近项目中有个需求,就是有四个模块需要加载一个主表的内容,比如说这个表叫项目表(比如项目表里有两个字段一个是项目ID--projCd,还有一个是项目名称--projNm).主表的内容的要放在一个下拉框 ...
- 将数据库表导入到solr索引
将数据库表导入到solr索引 编辑solrcofnig.xml添加处理器 <requestHandler name="/dataimport" class="org ...
- HTML5新特性之移动设备API
为了更好地为移动设备服务,HTML5推出了一系列针对移动设备的API. 1.Geolocation API Geolocation接口用于获取用户的地理位置.它使用的方法基于GPS或者其他机制(比如I ...
- 图解 & 深入浅出JavaWeb:事务必会必知
事务,大家所熟悉的事务(Transcation),基本上会就往Spring事务靠.其实Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring事务管理的基础.这篇总结 ...
- table变宽格式
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...