《剑指offer》java实现 输入n个数,找到其中最小的K个数
来源:互联网 发布:淘宝删除差评的链接 编辑:程序博客网 时间:2024/05/22 02:22
思路一:借助快排中的partition思想,需要改动输入数组,时间复杂度O(n)
public class MinK {
public static void main(String[] args) {
int a[]={4,5,1,6,2,7,3,8};
int k=5;
int b[]=getmink(a, k);
for(int i=0;i<b.length;i++){
System.out.print(b[i]+" ");
}
//System.out.println(partition2(a, 0, a.length-1));
}
public static int[] getmink(int a[],int k){
int n=a.length;
int b[]=new int[k];
for(int i=0;i<k;i++){
b[i]=0;
}
if(n>=k){
int start=0;
int end=n-1;
int pos=partition2(a, 0, n-1);
print(a);
while(pos!=k-1){
if(pos>k-1){
end=pos-1;
pos=partition2(a, start, end);
print(a);
}else{
start=pos+1;
pos=partition2(a, start, end);
print(a);
}
}
for(int i=0;i<k;i++){
b[i]=a[i];
}
}
return b;
}
public static void exch(int a[],int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static int partition2(int a[],int start,int end){
int i=start;
int j=end+1;
int basevalue=a[start];
while(true){
while(a[++i]<basevalue){
if(i==end){
break;
}
}
while(a[--j]>basevalue){
if(j==start){
break;
}
}
if(i>=j){
break;
}
exch(a, i, j);
}
exch(a, start, j);
System.out.println(j);
return j;
}
}
思路二:借助最大堆的思想,不改动输入数据,适用于海量数据,时间复杂度O(nlogk)
public class GetLeastKNumber1 {
public static void main(String[] args) {
int[] a={3,6,1,4,9,8,12,10};
prin(a);
heapsort(a);
prin(a);
int k=6;
int knum[]=getleastknumber(a, k);
prin(knum);
}
public static void prin(int[] a){
for(int i=0;i<a.length-1;i++){
System.out.print(a[i]+" ");
}
System.out.print(a[a.length-1]+"\n");
}
public static void maxheap(int [] data,int parent,int heapsize){
int left=parent*2;
int right=parent*2+1;
int large=parent;
if((left<=heapsize)&&(data[left-1]>data[parent-1])){
large=left;
}
if((right<=heapsize)&&(data[right-1]>data[large-1])){
large=right;
}
if(large!=parent){
int temp=data[parent-1];
data[parent-1]=data[large-1];
data[large-1]=temp;
maxheap(data, large, heapsize);
}
}
public static void buildmaxheap(int [] data){
for(int i=data.length/2;i>0;i--){
maxheap(data, i, data.length);
}
}
public static void heapsort(int data[]){
buildmaxheap(data);
for(int i=data.length;i>1;i--){
int temp=data[0];
data[0]=data[i-1];
data[i-1]=temp;
maxheap(data, 1, i-1);
}
}
public static int[] getleastknumber(int data[],int k){
int knum[]=new int[k];
if(data==null||k<1||data.length<k){
return null;
}
for(int i=0;i<k;i++){
knum[i]=data[i];
}
buildmaxheap(knum);
for(int i=k;i<data.length;i++){
if(data[i]<knum[0]){
knum[0]=knum[k-1];
maxheap(knum, 1, k-1);
knum[k-1]=data[i];
maxheap(knum, 1, k);
}
}
return knum;
}
}
- 《剑指offer》java实现 输入n个数,找到其中最小的K个数
- 输入n个数,输出最小的k个数,java实现
- java实现输入n个整数,找出其中最小的K个数
- 输入n个整数,找出其中最小的k个数
- 输入n个整数,找出其中最小的K个数
- 输入n个整数,找出其中最小的K个数
- n个数 找到最小的k个数 几种解法 和java实现
- 输入n个整数,找出其中最小的K个数。——冒泡排序实现方法
- 剑指offer:最小的k个数(java)
- 剑指offer----最小的k个数----java实现
- 最小的K个数 java实现 剑指offer
- 剑指offer_输入n个整数,找出其中最小的K个数
- 给定一个无序数组,找到其中最小的K个数
- 剑指offer (30)选择问题-----1.有一组N个数,确定其中第K个最大者;2.求最小的k个数
- 输入n个数,找出最小的k个数
- 【华为 OJ 】输入n个数,输出其中最小的k个
- java实现组合-n个数取其中k个数的所有组合
- 【剑指offer-Java版】30最小的K个数
- Maven学习总结(二)——Maven项目构建过程练习
- 文本内容溢出显示省略号,鼠标移上去会显示全部内容
- Win32 GetKeyState和getasynckeystate
- 迁移数据库的相关文件到存储中(目录不相同)
- JS冒泡事件
- 《剑指offer》java实现 输入n个数,找到其中最小的K个数
- C/C++复习:字符串的逆序输出(结合字符串的长度)
- File java的文件重命名
- uva1121 Subsequence(入门级)
- hdu5045
- int转string
- Unity3D学习笔记(9)—— 粒子光环
- linux下c编程main函数的参数问题
- ORB算法分析(草稿)