如何使用Java解决Top-K问题
题目
求最小的K个数
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
解题方案
方法一
排序(冒泡/选择)
思路
1,冒泡排序是每执行一次,就会确定最终位置,执行K次后,就可以得到结果,时间复杂度为O(n * k),当k< 2,选择排序每执行依次,就会通过确定一个最大的或最小的放在一端,通过选择排序,执行K次就可以得到最大的K个数了。时间复杂度时O(N * K)。 代码实现 分治-快速排序 思路 1,快速排序的核心是分治思想,先通过分治partition把序列分为两个部分,再将两个部分进行再次递归; 2,利用分治思想,即划分操作partition,根据主元素pivot调整序列,比pivot大的放在左端,比pivot小的放在右端,这样确定主元素pivot的位置pivotIndex,如果pivotIndex刚好是k-1,那么前k-1位置的数就是前k大的元素,即我们要求的top K。 时间复杂度: O(n) 代码实现 利用堆 思路 1,构建一个最大堆 2,遍历原数组,元素入队,当堆的大小为K时,只需要将堆顶元素于下一个元素比较,如果大于堆顶元素,则将堆顶元素删除,将该元素插入堆中,直到遍历完所有元素 3,将queue存储的K个数出队 时间复杂度:为O(N*logK) 代码实现 以上是如何使用Java解决Top-K问题的详细内容。更多信息请关注PHP中文网其他相关文章! //冒泡排序
public static int[] topKByBubble(int[] arr, int k) {
int[] ret = new int[k];
if (k == 0 || arr.length == 0) {
return ret;
}
for (int i = 0; i < k; i++) {
for (int j = arr.length - 1; j < i; j--) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
ret[i] = arr[i];
}
return ret;
}
//选择排序
public static int[] topKBySelect(int[] arr, int k) {
int[] ret = new int[k];
for (int i = 0; i < k; i++) {
int maxIndex = i;
int maxNum = arr[maxIndex];
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] > maxNum) {
maxIndex = j;
maxNum = arr[j];
}
}
if (maxIndex != i) {
swap(arr, maxIndex, i);
}
ret[i] = arr[i];
}
return ret;
}
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
方法二
public static int[] topKByPartition(int[] arr, int k){
if(arr.length == 0 || k <= 0){
return new int[0];
}
return quickSort(arr,0,arr.length-1,k);
}
//快速排序
public static int[] quickSort(int[] arr, int low, int high, int k){
int n = arr.length;
int pivotIndex = partition(arr, low, high);
if(pivotIndex == k-1){
return Arrays.copyOfRange(arr,0,k);
}else if(pivotIndex > k-1){
return quickSort(arr,low,pivotIndex-1,k);
}else {
return quickSort(arr,pivotIndex+1,high,k);
}
}
public static int partition(int[] arr, int low, int high){
if(high - low == 0){
return low;
}
int pivot = arr[high];
int left = low;
int right = high-1;
while (left < right){
while (left < right && arr[left] > pivot){
left++;
}
while (left < right && arr[right] < pivot){
right--;
}
if(left < right){
swap(arr,left,right);
}else {
break;
}
}
swap(arr,high,left);
return left;
}
public static void swap(int[] arr,int a, int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
方法三
public class TopK {
public int[] smallestK(int[] arr, int k) {
int[] ret = new int[k];
if(k==0 || arr.length==0){
return ret;
}
// 1,构建一个最大堆
// JDK的优先级队列是最小堆, 就要用到我们比较器
Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
//2,遍历原数组,进行入队
for(int value:arr){
if(queue.size() < k){
queue.offer(value);
}else{
if(value < queue.peek()){
queue.poll();
queue.offer(value);
}
}
}
//3,将queue中存储的K个元素出队
for(int i = 0;i < k;i++){
ret[i] = queue.poll();
}
return ret;
}
}

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python各有优势,适合不同场景。1.PHP适用于web开发,提供内置web服务器和丰富函数库。2.Python适合数据科学和机器学习,语法简洁且有强大标准库。选择时应根据项目需求决定。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP成为许多网站首选技术栈的原因包括其易用性、强大社区支持和广泛应用。1)易于学习和使用,适合初学者。2)拥有庞大的开发者社区,资源丰富。3)广泛应用于WordPress、Drupal等平台。4)与Web服务器紧密集成,简化开发部署。

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。
