牛客--剑指offer--最小的k个数
来源:互联网 发布:电脑发短信软件 编辑:程序博客网 时间:2024/03/29 23:59
一、问题描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
二、解题思路
主要是考察排序,本题实现了常用的插入排序,堆排序,归并排序,其中堆排序(最小堆)应该是速度最快的。
三、代码
1.插入排序
import java.util.*;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> result=new ArrayList<Integer>(); if(input==null || input.length==0 || k>input.length) return result; int j; for(int i=1;i<input.length;i++){ int tmp=input[i]; for(j=i;j>0 && tmp-input[j-1]<0;j--) input[j]=input[j-1]; input[j]=tmp; } for(int i=0;i<k;i++) result.add(input[i]); return result; }}
2.归并排序
import java.util.*;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> result=new ArrayList<Integer>(); if(input==null || input.length==0 || k>input.length) return result; int[] tmp=new int[input.length]; mergeSort(input,tmp,0,input.length-1); for(int i=0;i<k;i++) result.add(input[i]); return result; } private void mergeSort(int[] a,int[] tmp,int left,int right){ if(left<right){ int middle=left+(right-left)/2; mergeSort(a,tmp,left,middle); mergeSort(a,tmp,middle+1,right); merge(a,tmp,left,middle+1,right); } } private void merge(int[] a,int[] tmp,int leftpos,int rightpos,int rightend){ int leftend=rightpos-1; int numelements=rightend-leftpos+1; int tmppos=leftpos; while(leftpos<=leftend && rightpos<=rightend){ if(a[leftpos]<a[rightpos]) tmp[tmppos++]=a[leftpos++]; else tmp[tmppos++]=a[rightpos++]; } while(leftpos<=leftend){ tmp[tmppos++]=a[leftpos++]; } while(rightpos<=rightend) tmp[tmppos++]=a[rightpos++]; for(int i=0;i<numelements;i++,rightend--) a[rightend]=tmp[rightend]; }}3.堆排序(最小堆)
import java.util.*;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> result=new ArrayList<Integer>(); if(input==null || input.length==0 || k>input.length) return result; for(int i=input.length/2;i>=0;i--){ percDown(input,i,input.length); } for(int i=input.length-1;i>=(input.length-k);i--){ result.add(input[0]); swapReference(input,0,i); percDown(input,0,i); } return result; } private void percDown(int[] input,int i,int n){ int child=0; int tmp; for(tmp=input[i];leftChild(i)<n;i=child){ child=leftChild(i); if(child!=n-1 && input[child]>input[child+1]) child++; if(tmp>input[child]) input[i]=input[child]; else break; } input[i]=tmp; } private int leftChild(int n){ return 2*n+1;} private void swapReference(int[] input,int i,int j){ int tmp=input[i]; input[i]=input[j]; input[j]=tmp; }}
0 0
- 牛客--剑指offer--最小的k个数
- 剑指offer:最小的k个数
- 【剑指offer】最小的k个数
- 剑指offer-30:最小的k个数
- 最小的k个数(剑指offer)
- 剑指offer--最小的K个数
- 剑指Offer之 - 最小的k个数
- 剑指offer-30 最小的K个数
- 剑指offer之最小的k个数
- 剑指offer 30 - 最小的k个数
- 《剑指offer》最小的K个数
- 【剑指Offer】最小的K个数
- 剑指offer—最小的K个数
- 剑指Offer-30-最小的k个数
- 剑指offer:最小的K个数
- 【剑指offer】之最小的k个数
- [剑指offer:30]最小的k个数
- 剑指offer 29 最小的k个数
- [BZOJ3991][SDOI2015]寻宝游戏(dfs序+lca+set)
- 最简洁完整的Java高级教程之二(数据结构、集合、网络编程、多线程)
- Linux Kernel input设备之handler
- C C++的整数溢出陷阱
- Django1-10-5管理界面中文设置
- 牛客--剑指offer--最小的k个数
- Proteus仿真AT89C52——IO
- 欢迎使用CSDN-markdown编辑器
- 简述C++中STL标准模板库
- C++之析构函数与虚函数
- 坚持#第145天~想好了每天的规律,学习了一部分该学的内容
- 第二课-C++中的引用
- Hexo 搭建个人博客网站
- JAVA程序员面试总结,高手整整理加强版 出自“CSDN(www.csdn.net)”