【剑指Offer】29、最小的K个数
题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
解题思路:
本题最直观的解法就是将输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数,这取决于排序的时间复杂度,最快为O(nlogn)。
当我们可以对输入的数组进行修改时,可以得到一种更快的解法。类似于快速排序的思想,基于Partition函数来解决这个问题,如果我们选取数组的第n个数字(记为key)来进行数组重排,那么比key小的所有数字都位于数组的左边,比key大的所有数字都位于key之后,也就是数组的右边。
因此,我们只需要判断key的下标是否等于k-1,等于时返回其左边的K个数便是最小的K个数。当key的下标小于k-1时,就在右边继续划分,反之左边继续划分。由此我们可以得到以下代码实现,时间复杂度为O(n)。
编程实现(Java):
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
//方法一:排序
//方法二:partition分组
ArrayList<Integer> res=new ArrayList<>();
if(input==null || input.length<=0 || k>input.length)
return res;
int len=input.length;
int low=0,high=len-1;
int index=-1;
while(low<high && index!=k){
index=partition(input,low,high);
if(index>k)
high=index-1;
else
low=index+1;
}
for(int i=0;i<k;i++)
res.add(input[i]);
return res;
}
//划分算法,返回的i左边都比他小,右边都比他大
public int partition(int[] array,int low,int high){
int i=low,j=high;
int temp=array[low];
while(i<j){
while(i<j && array[j]>=temp)
j--;
if(i<j){
array[i]=array[j];
i++;
}
while(i<j && array[i]<temp)
i++;
if(i<j){
array[j]=array[i];
j--;
}
}
array[i]=temp;
return i;
}
}
【剑指Offer】29、最小的K个数的更多相关文章
- 剑指Offer 29. 最小的K个数 (其他)
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 题目地址 https://www.nowcoder.com/prac ...
- [剑指Offer] 29.最小的K个数
[思路1]全排序(快排)之后取出前K个数.O(K+nlogn) class Solution { public: vector<int> GetLeastNumbers_Solution( ...
- 剑指 Offer 40. 最小的k个数 + 优先队列 + 堆 + 快速排序
剑指 Offer 40. 最小的k个数 Offer_40 题目描述 解法一:排序后取前k个数 /** * 题目描述:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7. ...
- 剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:ar ...
- 【剑指Offer】最小的K个数 解题报告(Python)
[剑指Offer]最小的K个数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- 【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...
- Go语言实现:【剑指offer】最小的K个数
该题目来源于牛客网<剑指offer>专题. 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. Go语言实现: fu ...
- 每日一题 - 剑指 Offer 40. 最小的k个数
题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...
- 剑指OFFER之最小的K个数(九度OJ1371)
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1< ...
- 《剑指offer》最小的k个数
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
随机推荐
- MYSQL 运维
http://www.eimhe.com/thread-142990-1-1.html http://www.eimhe.com/search.php?mod=forum&searchid=6 ...
- PHP array_intersect_ukey()
定义和用法 array_intersect_ukey() 函数用回调函数比较键名来计算数组的交集. array_intersect_ukey() 返回一个数组,该数组包含了所有出现在 array1 中 ...
- HDU 4508
祼的完全背包问题 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...
- java 线程 原子类相关操作演示样例 thinking in java4 文件夹21.3.4
java 线程 原子类相关操作演示样例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.Time ...
- iOS分组通讯录效果+側滑菜单(MMDrawerController)
前言的废话-能够忽略 自从学会了使用Cocoapod,就欲罢不能了!由于太简单太赞了,不用再把源代码粘到project里了! 參见戴维营博客中的解说:Cocoapod 安装以及使用 先上一下效果图,请 ...
- hdu 1010 Tempter of the Bone (奇偶性剪枝)
题意:有一副二维地图'S'为起点,'D'为终点,'.'是可以行走的,'X'是不能行走的.问能否只走T步从S走到D? 题解:最容易想到的就是DFS暴力搜索,,但是会超时...=_=... 所以,,要有其 ...
- 传智播客C/C++学员荣膺微软&Cocos 2d-x黑客松最佳创新奖
6月30日,历时32小时的微软开放技术Cocos 2d-x 编程黑客松在北京望京微软大厦成功落下帷幕,这是微软开放技术首次联合Cocos 2d-x 在中国举办黑客松. 此次活动共同拥有包含传智播 ...
- oc31--new实现
// // main.m // new方法实现原理 #import <Foundation/Foundation.h> #import "Person.h" int m ...
- [NOIP 2014] 寻找道路
[题目链接] http://uoj.ac/problem/19 [算法] 首先,在反向图上从终点广搜,求出每个点是否可以在答案路径中 然后在正向图中求出源点至终点的最短路,同样可以使用广搜 时间复杂度 ...
- 杂项-TMod:常见错误
ylbtech-杂项-TMod:常见错误 1.返回顶部 1. 1.1. {Template Error} TypeError: dateDiff is not a function at Array. ...