最小的k个数(Java)

寻找最小k个数的两种算法

题目:

输入n个整数,找出其中最小的k个数。例如输入4、 5、 1、 6、 2、 7、 3、 8这8个数字,则最小的4个数字是1、 2、 3、 4。

思路:O(n)的算法,只有当我们可以修改输入的数组是可用

经典常用的算法,快速排序的精髓利用快速排序划分的思想,每一次划分就会有一个数字位于以数组从小到达排列的的最终位置index;位于index左边的数字都小于index对应的值,右边都大于index指向的值;所以,当index > k-1时,表示k个最小数字一定在index的左边,此时,只需要对index的左边进行划分即可;当index < k - 1时,说明index及index左边数字还没能满足k个数字,需要继续对k右边进行划分

代码实现:

public ArrayList<Integer> getLeastNumbers(int nums[], int k){
	ArrayList<Integer> list = new ArrayList<Integer>();
	int lens = nums.length;
	if(nums == null || lens == 0 || k > lens || k <= 0){
		return list;
	}
	int start = 0;
	int end = lens - 1;
	int index = partition(nums, start, end);
	while(index != k-1){
		if(index > k-1){
			end = index - 1;
			index = partition(nums, start, end);
		}else{
			start = index + 1;
			index = partition(nums, start, end);
		}
	}
	for (int i = 0; i < k; i++) {
		list.a
Java 中,可以使用流来获取文件内容,并从中找出最大的 k 个数。可以借助 `BufferedReader` 读取文件内容,同时使用优先队列(`PriorityQueue`)来维护最大的 k 个数。以下是示例代码: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.PriorityQueue; public class TopKNumbersInFile { public static void main(String[] args) { String filePath = "your_file_path"; // 替换为实际的文件路径 int k = 5; // 要获取的最大 k 个数 try { PriorityQueue<Integer> minHeap = new PriorityQueue<>(k); BufferedReader reader = new BufferedReader(new FileReader(filePath)); String line; while ((line = reader.readLine()) != null) { try { int num = Integer.parseInt(line); if (minHeap.size() < k) { minHeap.offer(num); } else if (num > minHeap.peek()) { minHeap.poll(); minHeap.offer(num); } } catch (NumberFormatException e) { // 处理非数字的行 System.out.println("Invalid number in line: " + line); } } reader.close(); // 输出最大的 k 个数 while (!minHeap.isEmpty()) { System.out.println(minHeap.poll()); } } catch (IOException e) { e.printStackTrace(); } } } ``` 上述代码中,首先定义了文件路径和要获取的最大 k 个数。然后使用 `BufferedReader` 逐行读取文件内容,对于每一行,尝试将其转换为整数。如果优先队列的大小小于 k,则直接将该整数加入队列;否则,如果该整数大于队列中的最小元素,则移除最小元素并将该整数加入队列。最后,输出优先队列中的所有元素,即为文件中最大的 k 个数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值