DataStructureAndAlgorithm--第 K 个最大值
设有一组 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]) {
System.out.println("circle" + (i - k + 1) + " : " + Arrays.toString(karr));
continue;
} else {
karr[k - 1] = arr[i];
BubbleMaxToMin(karr);
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 个最大值的更多相关文章
- 在数组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数组从大到小与新数组比较,如 ...
- 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和
[JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...
- 原创:从海量数据中查找出前k个最小或最大值的算法(java)
现在有这么一道题目:要求从多个的数据中查找出前K个最小或最大值 分析:有多种方案可以实现.一.最容易想到的是先对数据快速排序,然后输出前k个数字. 二.先定义容量为k的数组,从源数据中取出前k个填 ...
- Bone Collector II HDU - 2639 01背包第k最大值
题意: 01背包,找出第k最优解 题解: 对于01背包最优解我们肯定都很熟悉 第k最优解的话也就是在dp方程上加一个维度来存它的第k最优解(dp[i][j]代表,体积为i能获得的第j最大价值) 对于每 ...
- [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 ...
- 寻找第K大的数
在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,解决这个问题的方法很多. 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找 ...
- 【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 ...
- 面试题 收集请求k千里马
收集请求k最大值 个人信息:就读于燕大本科软件project专业 眼下大三; 本人博客:google搜索"cqs_2012"就可以; 个人爱好:酷爱数据结构和算法,希望将来从事算法 ...
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- 【学习Koa】原生koa2 静态资源服务器例子
实现思路 首先读取当前路径下所有的文件和文件夹 当去点击某个列表项时判断其实文件还是文件夹,文件的话直接读取,文件夹则再次利用上一个步骤读取并展示 文件结构 代码 index.js 入口文件 cons ...
- oracle函数创建与调用
函数的定义: CREATE OR REPLACE FUNCTION FUNCTION_TEST(PARAMER1 IN VARCHAR, -- 参数的类型不写长度 PARAMER2 OUT VARCH ...
- TX2_安装view_team
TX2上的帐号是:1317149963,dc200820305233 参考网站:https://blog.csdn.net/qq_33512213/article/details/90050792 安 ...
- TX2开发板Ubuntu16.04安装中文输入法
打开终端输入安装输入法: sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin ...
- 大数据高可用集群环境安装与配置(07)——安装HBase高可用集群
1. 下载安装包 登录官网获取HBase安装包下载地址 https://hbase.apache.org/downloads.html 2. 执行命令下载并安装 cd /usr/local/src/ ...
- .NET CORE AutoMapper使用
1.通过nuget安装AutoMapper,版本是7.0.1, 安装AutoMapper.Extensions.Microsoft.DependencyInjection 版本是4.0.1 不是以上 ...
- Essay写作“短路”怎么办?
有些留学生在完成essay写作过程中可能会短路,写着写着不知道自己在写什么,或者是直接动不了笔了,这种情况下应该怎么办呢?下面Australiaway小编就跟同学们分享一些比较有用的方法,希望可以帮到 ...
- JDK1.8 HashMap学习
1:源码分析 1.1:构造方法 public HashMap(int initialCapacity, float loadFactor) { ) throw new IllegalArgumentE ...
- SASS - 混合(Mixin)
SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...
- ✨vue引入组件 axios和icont矢量图标
axios 在vue项目开发中,我们使用axios进行ajax请求,很多人一开始使用axios的方式,会当成vue-resoure的使用方式来用,即在主入口文件引入import VueResource ...