剑指offer之求数组中最小的n个数
来源:互联网 发布:深圳市软件行业协会 编辑:程序博客网 时间:2024/06/05 07:15
牛客网上剑指offer原题:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
解法很多个人想到的四种下面一一记录下来:
1、直接暴力解决使用数组自带的排序完后,取其前k个,这种时间复杂度很高为:O(k*nlog2n)解法很简单不想解释。
2、冒泡排序外层循环的终止条件为i<k,时间复杂度为O(n*k)也很简单自己写
3、堆排序先循环建个大顶堆别问我为什么不用小顶堆,因为大顶堆在调整的时候会找到最小的数字然后将其放在数组的最后 时间复杂度O(nlog2k),代码如下:
import java.util.ArrayList;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { int length = input.length; ArrayList<Integer> list = new ArrayList<Integer>(); if(length==0||k<=0||k>length)return list; for(int i=0;i<k;i++){//循环建堆 BuildMaxHeap(input,length-1-i); swap(input,0,length-1-i);//每次将找到的最小值放在数组的最后 list.add(input[length-1-i]);//将找到的最小值放入容器准备返回 } return list; } public void swap(int[] a,int i,int j){ int temp = a[i]; a[i]=a[j]; a[j]=temp; } public void BuildMaxHeap(int[] a,int lastindex){ int k ; for(int i=(lastindex-1)/2;i>=0;i--){ k = i;//k表示待插入的索引 while((k*2+1)<=lastindex){ int index = k*2+1; //index表示k节点的左子节点 if(index<lastindex&&a[index]>a[index+1])index++;//若右子节点更小则索引指向右子节点,索引一定指向更小的子节点 if(a[k]>a[index]){ swap(a,k,index); k = index; } else{ break; } } } }}4、使用快速排序找到n的位置,使得比n小的数字个数为K个,时间复杂度为:O(nlog2n):
import java.util.ArrayList;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {ArrayList<Integer> list = new ArrayList<Integer>();if(input.length==0||k>input.length||k<=0)return list;int low=0;int high = input.length-1;int index = partition(input,low,high,k);while(index!=k-1){if(index>(k-1)){//若index不为所求的K,则向前后调整high = index-1;index = partition(input,low,high,k);}if(index<(k-1)){low = index+1;index = partition(input,low,high,k);}}for(int i=0;i<k;i++){list.add(input[i]);}return list;}private int partition(int[] a, int low, int high, int k) //一次快排int pivot = a[k-1];a[k-1] = a[low];while(low<high){while(low<high&&a[high]>=pivot)high--;a[low] = a[high];while(low<high&&a[low]<=pivot)low++;a[high] = a[low];}a[low] = pivot;return low;}}
1 0
- 剑指offer之求数组中最小的n个数
- 剑指offer-求数组中最小的k个数
- [剑指Offer]-求序列中最小的k个数
- 算法之求数组中最小的K个数
- 剑指offer面试题之求数组中逆序对的个数
- 求数组中最小的k个数
- 求n个数中最小的K个数。
- 剑指Offer之 - 最小的k个数
- 剑指offer之最小的k个数
- 【剑指offer】之最小的k个数
- 剑指offer之最小的K个数
- 求输入n个整数中最小的k个数
- 剑指offer:面试题30,求最小的K个数
- 剑指offer面试题之求1到n之间1的个数
- 使用堆栈 取数组中最小(最大)的n个数
- 剑指offer 面试题30 找出数组中最小的k个数
- 编程艺术之数组2.1 求最小的k个数
- 算法题:求数组中最小的k个数
- React基础语法 state和props初始化方式
- 图像中带通滤波器和带阻滤波器的关系(带通图像)
- insertion-sort-list
- happens-before规则和as-if-serial语义
- python: Matplotlib 教程
- 剑指offer之求数组中最小的n个数
- 设计模式之工厂模式
- 常用的8种排序算法总结
- HTTPS 与 HTTP2 协议分析
- Leetcode-397. Integer Replacement
- Dubbo Provider无法找到
- android 隐藏statusbar
- 任意多边形费马点&点群中位中心求解
- Jmeter函数之_StringFromFile