寻找最大的K个数,这个是面试中比较常见的一道题,网上也有很多例子,在这里先写一些比较传统的解法,以后会更新到比较好的算法。
这个题拿到之后首先会想到排序,排好序之后在选取选取最大的K个数。排序选择快速排序是个比较好的选择。
好了,让我们来进行第一个解法:快速排序
代码如下
public static void quickSort(int[] arr, int start, int end) {
if (start < end) {
int key = arr[start];
int right = start;
int left = end;
while (right < left) {
while (right < left && arr[left] > key) {
left --;
}
if (right < left) {
arr[right] = arr[left];
}
while (right < left && arr[right] <= key) {
right ++;
}
if (right < left) {
arr[left] = arr[right];
}
}
arr[right] = key;
quickSort(arr, start, right-1);
quickSort(arr, left+1, end);
}
}
快速排序之后,数组会是有序的,上面的排序是从小到大的,所以我们输出应该是下面这样
int k = 4;
for (int i=arr.length-1; i>=arr.length-k; i--) {
System.out.println(arr[i]+" ");
}
。第一个解法已经好了,但是有没有更好的办法。
答案是有的!我们可以选择部分排序,接下来我们使用选择排序来做解决这个问题。
代码如下:
public static int[] selectSortK(int[] arr, int k) {
if(arr == null || arr.length == 0) {
return null;
}
int[] newArr = new int[k];
List<Integer> list = new ArrayList<Integer>();//记录每次最大数的下标
for (int i=0; i<k; i++) {
int maxValue = Integer.MIN_VALUE; //最大值
int maxIndex = i;
for (int j=0; j<arr.length; j++) {
if (arr[j] > maxValue && !list.contains(j) ) {
maxValue = arr[j];
maxIndex = j;
}
}
if (!list.contains(maxIndex)) {//如果不存在,就加入
list.add(maxIndex);
newArr[i] = maxValue;
}
}
return newArr;
}
源码下载
http://www.exceptionhelp.com/posts/539
分享到:
相关推荐
用最优的算法,寻找到一个序列之中的K各最大的数
文档通过之前的寻找最小k个数的问题作为铺垫,探讨了Top K算法的实现,特别是寻找最大k个数的情况。文章强调,虽然寻找最大k个数和最小k个数在原理上相似,但Top K算法在搜索引擎和大数据处理等领域有更广泛的应用。...
在Java编程中,寻找最大的K个数是一个常见的算法问题,主要出现在面试和数据结构与算法的练习中。这个问题要求从一个整数数组中找到最大的K个元素,而不仅仅是最大值。传统的解法通常包括排序整个数组,然后取前K个...
如果第k个元素比最大值小,更新最大值。接着,跳过k个元素,再比较第2k个元素,依此类推。直到遍历完整个数组,最后的最大值即为第k小元素。跳跃选择的平均时间复杂度为O(n),最坏情况下为O(n^2)。 4. 分治法: 将...
在Python编程中,高效地找出一个集合中最大的K个数或者最小的K个数是一个常见的需求。Python标准库提供了一个名为`heapq`的模块,它包含了一系列与堆相关的功能,能够有效地解决这类问题。本篇文章将详细讲解如何...
在这个问题中,我们要在数组中找到第k个最小的元素,同时考虑到数组中可能存在重复的元素。这个问题在实际应用中广泛出现,比如数据库查询优化、数据分析以及在线竞赛编程等场景。 在Visual C++环境下实现寻找第k小...
为了统计数组中每个数出现的次数,可以使用计数器数组的方式。首先创建一个长度为10001的数组(考虑到元素的最大值为10000),然后遍历输入数组,对于每个元素,在对应的计数器数组位置上加1。最后再遍历一次计数器...
文章进一步对h(k)进行定义,即h(k)为前k个自然数之和。通过这个函数的定义,作者建立了一个关于k的不等式关系,以此来界定n的范围。 文章也提到了一个关键的函数P(k),这个函数利用了h(k)和h(k+1)来界定n的范围,这...
K-means算法的核心思想是通过迭代寻找数据的最佳划分,将数据集分为K个簇(cluster),每个簇的中心(centroid)由簇内所有数据点的均值计算得出。这个过程不断重复,直到簇的分配不再发生变化或者达到预设的迭代...
在计算机科学和编程领域,"通过最大堆求topk"是一种高效的算法,常用于寻找一个大数组中的前k个最大元素。这个算法的核心是利用数据结构——最大堆(Max Heap)来实现。最大堆是一种完全二叉树,其中每个父节点的值...
k优解通常出现在排序、选择问题或竞赛排名等场景,例如找到前k个最大或最小的元素。 描述虽然没有提供具体细节,但可以推测是关于如何有效地在一组数据中找出第k个最佳解的不同方法。 标签"ui"可能是指这些方法...
今天,我们将探讨一种高效的解决方案,该方案在C语言中实现,并采用经典的埃拉托斯特尼筛法(Sieve of Eratosthenes)来寻找并打印出指定范围内的最大k个素数。 埃拉托斯特尼筛法,这个名字来源于古希腊数学家...
// 寻找满足整除3,并且末尾是0或者5的最大数 for (int i = len; i >= 1; i--) { if (a[i].rest == 0 || a[i].rest == 2) { cout [i].x; } } return; } ``` 算法复杂性分析: 该算法的时间复杂度主要体现在...
- **功能**:通过交换数组中某些元素的位置来提高寻找最大值和最小值的效率。 - **实现**: - 首先计算中间索引 `k`。 - 将数组分为两部分,对于每一对 `(x[i], x[k+i])`,如果 `x[k+i] [i]`,则交换它们的位置。 ...
在一组无序的数值中,第k大的数字是指除去其中最大的k-1个数字后剩下的那个最大值。例如,对于数组[3, 5, 6, 7, 2, -1, 9, 3],第5大的数字是6,因为它在去除数组中的前4个最大元素(9, 7, 6, 5)后剩余的最大值。 ...
### Python求n以内最大的k个素数 #### 素数的基本概念与重要性 素数是只能被1和它本身整除的大于1的自然数。素数的研究历史源远流长,从古希腊时期的欧几里得到现代数学家们的研究,素数一直是数学领域的一个核心...
然后,依次弹出堆顶元素(即当前最大元素),并记录已弹出的元素个数。当弹出的元素个数等于k-1时,堆顶剩下的元素就是第k小的元素。堆排序法的时间复杂度为O(n log n)。 3. **线性时间复杂度的解决方案**: 当...