`
exceptionhelp
  • 浏览: 45103 次
社区版块
存档分类
最新评论

寻找最大的K个数

    博客分类:
  • java
阅读更多
寻找最大的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
0
0
分享到:
评论
1 楼 mfkvfn 2014-04-10  
用不着这么复杂吧。应该跟寻找最大数一样的。寻找最大数一般
max=arr[0];
for(i=i;i<len;i++){
   if(arr[i]>max){
      max=arr[i];
   }
}


这个应该类似的办法就可以。
max=arr[0,K-1]
sort(max); //升序
for(i=K;i<len;i++){
   if(arr[k]>max[0]){
     max[0]=arr[k]; //删除max[0],添加arr[i]
     sort(max);
   }
}
//输出max

相关推荐

    用效率比较高的算法寻找K个最大的数

    用最优的算法,寻找到一个序列之中的K各最大的数

    JAVA中寻找最大的K个数解法

    寻找最大的K个数,这个是面试中比较常见的一道题,网上也有很多例子,在这里是比较传统的解法

    微软技术面试-寻找最大的K个数

    一个比较经典的面试题目,从时间复杂度的角度分析了几种解决方案的优劣,值得一看。

    最大K个数问题的Python版解法总结

    TopK问题,即寻找最大的K个数,这个问题非常常见,比如从1千万搜索记录中找出最热门的10个关键词. 方法一: 先排序,然后截取前k个数. 时间复杂度:O(n*logn)+O(k)=O(n*logn)。 这种方式比较简单粗暴,提一下便是。 方法...

    python numpy 部分排序 寻找最大的前几个数的方法

    以上这篇python numpy 部分排序 寻找最大的前几个数的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:python numpy和list查询其中某个数的个数及...

    求取序列中第K个最大值的python代码

    采用分治算法寻找序列A中第k个大的值,Divide and Conquer的方法能够有效地降低问题的时间复杂度。

    C#,K中心问题(K-centers Problem)的算法与源代码

    k-centers problem: 寻找k个半径越小越好的center以覆盖所有的点。 比如:给定n个城市和每对城市之间的距离,选择k个城市放置仓库(或ATM或云服务器),以使城市到仓库(或ATM或云服务器)的最大距离最小化。 再...

    kmp.rar_K.

    串的模式匹配可以从模式p的p[k]开始与正文t的t[j+i]开始...=t[j+i+l-1]时,重新寻找新的p[k+l]的那个最大k 然后再比较p[k ]=?=t[j+i+l]直至匹配或遍历结束)。省去了前面的k次比较。当对应p[i]的k有多个,取最大的k。

    k-means算法python源码

    k-means算法是一种无监督学习的聚类算法,用于将数据集划分为k个不同的簇。它通过迭代的方式寻找使得簇内的样本相似度最大化、簇间的样本相似度最小化的质心点。 具体而言,k-means算法的步骤如下: 随机选择k个...

    Python实现的寻找前5个默尼森数算法示例

    本文实例讲述了Python实现的寻找前5个默尼森数算法。分享给大家供大家参考,具体如下: 找前5个默尼森数。 若P是素数且M也是素数,并且满足等式M=2**P-1,则称M为默尼森数。例如,P=5,M=2**P-1=31,5和31都是素数,...

    improved-harris.zip_K.

    该算法首先选取一个具有最大最小特征值的点(即:max(min(e1,e2)),e1,e2是harris矩阵的特征值)作为角点,然后依次按照最大最小特征值顺序寻找余下的角点,当然和前一角点距离在容忍距离内的新角点呗忽略。

    调用sklearn库的K-Means聚类分析实例

    #(4)init=’k-means++’ 会由程序自动寻找合适的n_clusters; #(5)tol:float形,默认值= 1e-4,与inertia结合来确定收敛条件; #(6)n_jobs:指定计算所用的进程数; #(7)verbose 参数设定打印求解过程的...

    leetcode岛屿的最大面积-LeetCode:标记我在https://leetcode.com/上练习的问题的解决方案

    寻找两数平方和等于第三个数 字符串回文 归并排序数组 链表是否有环 字符串最长单词 排序 第 K 个元素 Top-K Frequency elements 根据字母频率排序 图的遍历 岛屿的最大面积 朋友圈 岛屿数量 二叉树叶子到根的路径 ...

    PTA-公因数与公约数

    最大公因数(Greatest Common Divisor,简称GCD),也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。整数m和n的最大公约数记为GCD(m, n)。 最小公倍数(Least Common Multiple,简称LCM)是指两个...

    初级程序员2016年下半年下午真题

    下面的流程图在该数组中寻找连续排列的若干个元素,使其和达到最大值,并输出其起始下标K、元素个数L以及最大的和值M。 例如,若数组元素依次为3,-6,2,4,-2,3,-1,则输出K=3,L=4,M=7。该流程图中考察了A[1:N...

    python:模拟退火算法解决函数优化问题(最小值、最大值)

    该代码采用python编写模拟退火算法,整个过程中可以根据更改代码求解最大值与最小值。 1. 模拟退火算法的原理: 输入:温度T、退火控制参数k、初始点x0 输出:最优的自变量值、最大/最小值 (1)给定初始值温度T,...

    剑指Offer(Python多种思路实现):二叉搜索树的第K大节点

    例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。 解题思路一:中序遍历 class Solution: # 返回对应节点TreeNode def KthNode(self, pRoot, k): # write code here if not pRoot or...

    leetcode寻找最近的-LeetCode:LeetCode漫漫刷题之路

    leetcode寻找最近的 LeetCode漫漫刷题之路 鹅厂面试题之数组与字符串 1、两数之和 2、寻找两个有序数组的中位数 3、最长回文子串 4、字符串转换整数 (atoi) 5、最长公共前缀 ...1、数组中第K个最大元素

Global site tag (gtag.js) - Google Analytics