设有一组 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. linux项目,项目报错,排查

    今天在遇到以前部署的项目突然没有数据了,然后就去服务器看了一下,打印日志发现报错了,现在我是一脸懵逼,因为不知道怎么排查 然后同事告诉说先看报错的原因,然后再去找认识的类,我打码的都是一些认识的 然后 ...

  2. java嵌套循环练习

    打印一个等腰三角形 package com.lv.jj; import java.util.Scanner; public class DemoDy { public static void main ...

  3. PL/SQL表结构/数据的导出

    1.表结构导出 方法一:在sql页面点击表名,进入表编辑页面,点击右下角“查看SQL”按钮,即可看到表结构 方法二:工具--导出用户对象 去掉所有者勾选项,即***.表名:用户名字在其他用户导入数据库 ...

  4. 996.ICU 爆发,互联网从业者难逃“高薪陷阱”

    从 3 月 27 日开始,截止本文发稿,GitHub 上面的项目 996.ICU 的 Star 数量已经超过 18 万,这场由程序员发动的轰轰烈烈的公开反对 996 工作制的运动,早已突破互联网圈层而 ...

  5. ios 进阶技术点

    1.Runtime的消息转发机制 消息转发机制基本上分为三个步骤: 1. 动态方法解析 2. 备用接收者 3. 完整转发 2.Runloop的工作原理 runloop.autorelease pool ...

  6. 爬虫(十八):Scrapy框架(五) Scrapy通用爬虫

    1. Scrapy通用爬虫 通过Scrapy,我们可以轻松地完成一个站点爬虫的编写.但如果抓取的站点量非常大,比如爬取各大媒体的新闻信息,多个Spider则可能包含很多重复代码. 如果我们将各个站点的 ...

  7. nginx报错

    1. nginx报错 nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid&q ...

  8. docker - how do you disable auto-restart on a container?

    https://stackoverflow.com/questions/37599128/docker-how-do-you-disable-auto-restart-on-a-container 9 ...

  9. 吴裕雄--天生自然C++语言学习笔记:C++ 常量

    常量是固定值,在程序执行期间不会改变.这些固定的值,又叫做字面量. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符.字符串和布尔值. 常量就像是常规的变量,只不过常量的值在定义后不能进行 ...

  10. SASS- 局部文件(Partial)

    SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...