当前位置:网站首页>牛客题目——最小的K个数
牛客题目——最小的K个数
2022-07-27 14:54:00 【zhangzhang_one】
题目描述
给定一个长度为n的可能有重复值的数组,找出其中不去重的最小的k个数。例如数组元素是4,5,1,6,2,3,7,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。
要求:空间复杂度O(n),时间复杂度O(nlogn)。
示例
输入:[0,1,2,1,2],3
返回值:[0,1,1]
解题思路
先排序,后取前n个数就是所求结果
快排、冒泡、归并、堆排序都可以
基于堆排序的做法如下:
- 首先创建大小为k的数组,将其调整成大根堆;
- 遍历从k+1下标开始的整数,如果存在更小的数字时,将其与堆的根交换,再调整为大根堆;
- 重复上述操作,知道遍历完n个数,前k个数即为结果。
代码实现
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> leastNumbers = new ArrayList<Integer>();
while(input == null || k<=0 || k>input.length)
return leastNumbers;
//用于存放最小的k个数,多申请一个单元,使得结点序号从1开始
int[] numbers = new int[k+1];
for(int i=1;i<k+1;i++)
numbers[i] = input[i-1];
//初始化最大堆
for(int i = k/2;i>=1;i--)
heapAdjust(numbers,i,k);
//当输入中存在更小的数字时,重新调整最大堆
for(int i=k;i<input.length;i++){
if(input[i] < numbers[1]){
numbers[1] = input[i];
heapAdjust(numbers,1,k);
}
}
for(int i=1;i<=k;i++){
leastNumbers.add(numbers[i]);
}
return leastNumbers;
}
//最大堆的调整方法
public void heapAdjust(int[] array,int start,int end){
int temp = array[start];
for(int j=start*2;j<=end;j*=2){
//筛选出大孩子结点
if(j<end && array[j]<array[j+1]) j++;
if(temp>=array[j]) break;
//向下筛选,将大结点调整到start位置
array[start] = array[j];
start = j;
}
array[start] = temp;
}
}
# python,归并排序实现
class Solution:
def merge(self,array,low,mid,high):
temp = []
p1 = low
p2 = mid+1
while p1<=mid and p2<=high:
if array[p1] <= array[p2]:
temp.append(array[p1])
p1 += 1
else:
temp.append(array[p2])
p2+=1
while p1<=mid:
temp.append(array[p1])
p1+=1
while p2<=high:
temp.append(array[p2])
p2+=1
for i in range(len(temp)):
array[low+i] = temp[i]
def mergeSort(self,array,low,high):
if low < high:
mid = (low+high)//2
self.mergeSort(array, low, mid)
self.mergeSort(array, mid+1, high)
self.merge(array,low,mid,high)
def GetLeastNumbers_Solution(self , input: List[int], k: int) -> List[int]:
self.mergeSort(input, 0, len(input)-1)
return input[:k]
边栏推荐
- Circular statements and arrays
- ShardingSphere-proxy-5.0.0分布式雪花ID生成(三)
- Json数据的格式使用
- The difference between select/poll/epoll
- TP5 query empty two cases
- Clear understanding of torchvision (mind map)
- excel skill
- 201403-1
- Scala branch control (single branch, double branch, multi branch), return value of branch judgment
- Cubemx combined with IAR engineering transplantation
猜你喜欢

实测:云RDS MySQL性能是自建的1.6倍

Automatic classification of e-commerce UGC pictures using Baidu PaddlePaddle easydl

Scala branch control (single branch, double branch, multi branch), return value of branch judgment

使用百度飞桨EasyDL实现电商UGC图片自动分类

【论文阅读】Single- and Cross-Modality Near Duplicate Image PairsDetection via Spatial Transformer Compar

my_ Ls summary

Rotate string left

MySQL—连表查询

training on multiple GPUs pytorch

Fast Planner - detailed explanation of kinetic astar
随机推荐
Bean: Model: Entity的区别
JSON data parsing
String numeric type converted to thousands
Filament Creator材质编辑工具的实现
201403-1
TP5 rewrite paging
excel skill
JDBC程序实现完整步骤
Database notes sorting
Duplicate numbers in array
Handling of multiple parts with duplicate names and missing parts when importing SOLIDWORK assemblies into Adams
Mazak handwheel maintenance Mazak little giant CNC machine tool handle operator maintenance av-eahs-382-1
Automatic classification of e-commerce UGC pictures using Baidu PaddlePaddle easydl
Array analog linked list
The method of inserting degree in word
实测:云RDS MySQL性能是自建的1.6倍
2021-03-09
CCF-201312-1
Opencv (I) -- basic knowledge of image
Gurobi——GRBEnv