设有一组 N 个数而要确定其中第 K 个最大者,我们称之为选择问题(selection problem)。

该问题的一种解法就是将这 N 个数读进一个数组中,再通过某种简单的算法,比如冒泡排序法,以递减顺序将数组排序,然后返回位置 K 上的元素。

稍微好一点的算法可以先把前 K 个元素读入数组并(以递减的顺序)对其排序。接着,将剩下的元素再逐个读入。当新元素被读到时,如果它小于数组中的第 K 个元素则忽略之,否则就将其放到数组中正确的位置上,同时将数组中的一个元素挤出数组。当算法终止时,位于第 K 个位置上的元素作为答案返回。

 package c1.kmax;

 import java.util.Arrays;

 /**
* 一组 N 个数确定其中第 K 个最大者
*
* @author MicroCat
*
*/
public class KMax { public static void main(String[] args) {
try {
int[] arr = { 12, 4, 6, 3, 4, 5, 0, -8 };
int[] arr2 = { 12, 4, 6, 3, 4, 5, 0, -8 };
int k = 5;
System.out.println("The " + k + " largest in arrays : " + kmax1(arr, k));
System.out.println("The " + k + " largest in arrays : " + kmax2(arr2, k));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* 读入 K 个元素至新数组,以递减方式储存。 将剩下的元素再逐个读入。若小于新数组的最小值,跳过;否则,替换新数组最末位元素,重新排序。
* 最后返回新数组最末位元素。
*
* @param arr
* @param k
* @return
* @throws Exception
*/
public static int kmax2(int[] arr, int k) throws Exception {
try {
if (k <= 0 || k > arr.length) {
throw new Exception("k value out of range!");
}
int[] karr = new int[k];
System.arraycopy(arr, 0, karr, 0, k);
BubbleMaxToMin(karr);
for (int i = k; i < arr.length; i++) {
if (arr[i] <= karr[k - 1]) {
// print
System.out.println("circle" + (i - k + 1) + " : " + Arrays.toString(karr));
continue;
} else {
karr[k - 1] = arr[i];
BubbleMaxToMin(karr);
// print
System.out.println("circle" + (i - k + 1) + " : " + Arrays.toString(karr));
}
}
System.out.println(Arrays.toString(karr));
return karr[k - 1];
} catch (Exception e) {
// TODO: handle exception
throw e;
}
} /**
* 冒泡法由大到小排序
*
* @param karr
*/
private static void BubbleMaxToMin(int[] karr) {
for (int i = 0; i < karr.length; i++) {
for (int j = karr.length - 1; j > i; j--) {
if (karr[j] > karr[j - 1]) {
karr[j] = karr[j] ^ karr[j - 1];
karr[j - 1] = karr[j] ^ karr[j - 1];
karr[j] = karr[j] ^ karr[j - 1];
}
}
}
} /**
* 冒泡法排序直接返回第 K-1 元素
*
* @param arr
* @param k
* @return
* @throws Exception
*/
public static int kmax1(int[] arr, int k) throws Exception {
try {
if (k <= 0 || k > arr.length) {
throw new Exception("k value out of range!");
}
BubbleMaxToMin(arr);
System.out.println(Arrays.toString(arr));
return arr[k - 1];
} catch (Exception e) {
// TODO: handle exception
throw e;
} } }

DataStructureAndAlgorithm--第 K 个最大值的更多相关文章

  1. 在数组a中,a[i]+a[j]=a[k],求a[k]的最大值,a[k]max——猎八哥fly

    在数组a中,a[i]+a[j]=a[k],求a[k]的最大值,a[k]max. 思路:将a中的数组两两相加,组成一个新的数组.并将新的数组和a数组进行sort排序.然后将a数组从大到小与新数组比较,如 ...

  2. 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和

    [JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...

  3. 原创:从海量数据中查找出前k个最小或最大值的算法(java)

    现在有这么一道题目:要求从多个的数据中查找出前K个最小或最大值 分析:有多种方案可以实现.一.最容易想到的是先对数据快速排序,然后输出前k个数字.   二.先定义容量为k的数组,从源数据中取出前k个填 ...

  4. Bone Collector II HDU - 2639 01背包第k最大值

    题意: 01背包,找出第k最优解 题解: 对于01背包最优解我们肯定都很熟悉 第k最优解的话也就是在dp方程上加一个维度来存它的第k最优解(dp[i][j]代表,体积为i能获得的第j最大价值) 对于每 ...

  5. [LeetCode] Max Sum of Rectangle No Larger Than K 最大矩阵和不超过K

    Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...

  6. 寻找第K大的数

    在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,解决这个问题的方法很多. 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找 ...

  7. 【leetcode】363. Max Sum of Rectangle No Larger Than K

    题目描述: Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the ma ...

  8. 面试题 收集请求k千里马

    收集请求k最大值 个人信息:就读于燕大本科软件project专业 眼下大三; 本人博客:google搜索"cqs_2012"就可以; 个人爱好:酷爱数据结构和算法,希望将来从事算法 ...

  9. HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. 《thinkphp》二、创建实例

    1.目录结构 project 应用部署目录 ├─application 应用目录(可设置) │ ├─common 公共模块目录(可更改) │ ├─index 模块目录(可更改) │ │ ├─confi ...

  2. H5页面跳到安卓APP和iosAPP

    if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { // window.webkit.messagehandlers是js的固定写法, ...

  3. 用cat写入

    $ cat >> gzip_work.sh <<EOF > mkdir gzip/workshell > EOF

  4. 关于SI4432的问题简单讲解

    对于SX1278 和SI4432的对比性,下面为大家展示对比参数: 由此可以看出的SI4432虽然跟SX1278有部分地方不同,但是整体来说还是差别不大,各有各的长处和短处,性价比上个人还是觉得SI4 ...

  5. CSS根据屏幕分辨率宽度自动适应的办法

    CSS根据屏幕分辨率宽度自动适应的办法 第一种办法是js选择CSS <SCRIPT language=JavaScript><!-- Beginif (screen.width == ...

  6. python 奇淫技巧之自动登录 哔哩哔哩

    前言 嘿,各位小伙伴好呀,今天要带来点什么干货呢,就从我的实际开发中来给大家带来一个案例吧,如何自动登录 哔哩哔哩 接到老大通知,让我自动写一个自动登录 哔哩哔哩 的脚本,我当然是二话不说直接开怼,咱 ...

  7. Web前端工程师需要注意的开发规范有哪些?

    从事web前端开发工作我们就需要了解web前端开发的规范,这样才能保证高效快速的完成工作,本篇就和大家分享一下web前端开发工程师需要注意的web前端开发规范有哪些,希望对小伙伴们有所帮助. web前 ...

  8. 合理控制MBA Essay写作字数很重要

    作为一个MBA申请人,在Essay写作的时候一定会迸发各种各样的想法和念头,想要统统传达给招生官.然而面对有限的字数限制,想要尽可能多地在Essay中涵盖重要信息,就让人颇为头痛了. 面对想要倾诉的欲 ...

  9. POJ 3087:Shuffle'm Up

    Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7364   Accepted: 3408 Desc ...

  10. ..\OBJ\LED.axf: Error: L6218E: Undefined symbol EXTI_Init (referred from exti.o). 错误修改

    今天在移植野火的程序到元子的开发平台上时候,发现自己在中断初话中断函数的时候出现了:..\OBJ\LED.axf: Error: L6218E: Undefined symbol EXTI_Init ...