在未排序的数组中找到第 k 个最大的元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
思路方法:
这道题思路就挺简单的,考查的就是对排序算法的了解。就用排序算法把数组元素按照降序排列,最后返回排序好的数组中下标为k-1的元素即是答案。
下面我写了几种方法:
package xupt.ymm.exercise;
public class K1 {
//插入排序
public static int findKMax1(int[] nums, int k) {
int len = nums.length;
for(int i = 1;i < len;i++) {
//遍历整个数组,从下标为1开始,因为第一个数字和自己永远那都是有序的
int j = i;
int tmp = nums[i] ;//找到未排序的数组的第一个
while(j > 0 && tmp > nums[j - 1] ) { //和之前排好的进行比较
nums[j] = nums[j - 1]; //大了就交换
j--;
}
nums[j] = tmp; //不打就还是原来的位子
}
return nums[k - 1]; //返回从大到小排序的第k-1的数就是目标
}
//选择排序
public static int findKMax2(int[] nums,int k) {
int len = nums.length;
int tmp;
for(int i = 0;i < len - 1;i++) { //从零开始遍历
int max = i;
for(int j = i + 1;j < len;j++) { //未排序遍历
if(nums[j] > nums[max]) { //后面的比前面的大
max = j; //把大的当最大值
}
}
tmp = nums[i];//前面小的和最大值交换
nums[i] = nums[max];
nums[max] = tmp;
}
return nums[k - 1];
}
//冒泡排序
public static int findKMax3(int[] nums,int k) {
int len = nums.length;
int i = len - 1;
while(i > 0) {
int count = 0;
for(int j = 0;j < i;j++) {
if(nums[j + 1] > nums[j]) {
int temp = nums[j + 1];
nums[j + 1] = nums[j];
nums[j] = temp;
count = j + 1;
}
}
i = count;
}
return nums[k - 1];
}
//冒泡排序
public static int findKMax4(int[] nums,int k) {
int len = nums.length;
for(int i = 0;i < len - 1;i++) {
for(int j = i + 1;j < len;j++) {
if(nums[j] > nums[i]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
return nums[k - 1];
}
//测试
public static void main(String[] args) {
int [] nums = {3,2,1,5,6,4};
int k = 2;
findKMax4(nums,k);
for(int n = 0;n < nums.length;n++) {
System.out.print(nums[n] + " ");
}
System.out.println("findKMax4 " + findKMax4(nums,k));
findKMax3(nums,k);
for(int n = 0;n < nums.length;n++) {
System.out.print(nums[n] + " ");
}
System.out.println("findKMax3 " + findKMax3(nums,k));
findKMax2(nums,k);
for(int n = 0;n < nums.length;n++) {
System.out.print(nums[n] + " ");
}
System.out.println("findKMax2 " + findKMax2(nums,k));
findKMax1(nums,k);
for(int n = 0;n < nums.length;n++) {
System.out.print(nums[n] + " ");
}
System.out.println("findKMax1 " + findKMax1(nums,k));
}
}
运行结果如下:

以上就是我对这个题目的解答,用来三种排序,其实也可以有其他的排序都可以。如果有需要,请自行完成,我就不一一列举了。
在未排序的数组中找到第 k 个最大的元素的更多相关文章
- 【一起刷LeetCode】在未排序的数组中找到第 k 个最大的元素
题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- leetcode.排序.215数组中的第k个最大元素-Java
1. 具体题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 : 输入: [3,2,1,5,6,4] 和 k = ...
- [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)
题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...
- 算法总结之 在两个排序数组中找到第K小的数
给定两个有序数组arr1 和 arr2 ,再给定一个int K,返回所有的数中第K小的数 要求长度如果分别为 N M,时间复杂度O(log(min{M,N}),额外空间复杂度O(1) 解决此题的方法跟 ...
- 数组中的第K个最大元素leetcode(Top K的问题)
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- [Swift]LeetCode215. 数组中的第K个最大元素 | Kth Largest Element in an Array
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- LeetCode题解 | 215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- Leetcode 215. 数组中的第K个最大元素 By Python
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- 215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示 ...
随机推荐
- Python3 Pandas的DataFrame数据的增、删、改、查
Python3 Pandas的DataFrame数据的增.删.改.查 一.DataFrame数据准备 增.删.改.查的方法有很多很多种,这里只展示出常用的几种. 参数inplace默认为False,只 ...
- 基础_模型迁移_CBIR_augmentation
在之前我们做过这样的研究:5图分类CBIR问题 各不相同的 5类的图形,每类100张 import numpy as npfrom keras.datasets import mnistimport ...
- Codeforces 675E Trains and Statistic - 线段树 - 动态规划
题目传送门 快速的vjudge通道 快速的Codeforces通道 题目大意 有$n$个火车站,第$i$个火车站出售第$i + 1$到第$a_{i}$个火车站的车票,特殊地,第$n$个火车站不出售车票 ...
- DOM元素加载之前执行的jQuery代码
<script type="text/javascript"> (function() { alert("DOM还没加载哦!"); })(jQuer ...
- 关于二进制——lowbit运算
lowbit(n)意思即为找出n在二进制表示下最后一位1即其后面的0所组成的数值,别的东西算法书上有,这里提出一个重要的公式 lowbit(n)=n&(~n+1)=n&(-n),这个有 ...
- C# 文件与二进制之间的转换
/// <summary> /// 工具类:文件与二进制流间的转换 /// </summary> public class FileBinaryConvertHelper { ...
- Android 充电信息的获取【转】
本文转载自:https://blog.csdn.net/wateryi/article/details/50834821 在android系统中,电池信息是由BatteryService.java统一 ...
- 为什么不能用drop function add 去删除函数? 因为不能使用 mysql中的保留字!
mysql中有很多的 保留字, 也叫关键字, 你在使用 数据库中的任何东西, 都最好是 避开这些关键字/保留字, 包括 数据库名, 表名, 字段名, 函数名, 存储过程名. 这些关键字包括: mysq ...
- 论文阅读之: Hierarchical Object Detection with Deep Reinforcement Learning
Hierarchical Object Detection with Deep Reinforcement Learning NIPS 2016 WorkShop Paper : https://a ...
- Unity3D学习笔记(三十二):Xlua(2)
Xlua支持通过子类对象访问父类的变量属性和方法 对于C#的ref,out参数的方法 当调用的时候:out类型的参数是不需要传递实参的,普通的参数和ref参数需要传递实参. out,ref传出值通 ...