在未排序的数组中找到第 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示 ...
随机推荐
- 作为php了解一下共享内存的概念及优缺点
共享内存是一种在相同机器中两个正在运行的进程之间共享和传递数据的有效方式,不同进程之间共享的内存通常安排为同一段物理内存:顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.一个进程可创建一 ...
- Fiddler(三)Fiddler 报错creation of the root certificate was not successful
打开CMD,找到Fiddler所在目录,我这里是把汉化版的解压在了桌面,所以通过CMD进入桌面下的Fiddler文件夹. 执行命令 makecert.exe -r -ss my -n -h -cy a ...
- mysql 5.7/percona server/mariadb 10.2安装与服务器参数优化
建议使用percona server linux generic版,从https://www.percona.com/downloads/Percona-Server-LATEST/下载,现在不在推荐 ...
- php7安装redis拓展
phpredis下载地址https://github.com/phpredis/phpredis 解压并进入源码包 unzip phpredis-develop.zip cd phpredis-d ...
- opencv学习之路(14)、形态学之膨胀腐蚀
一.膨胀腐蚀概述(对高亮部分进行操作) 二.膨胀 三.腐蚀 四.代码 1.查看结构元素 #include<opencv2/opencv.hpp> #include<iostream& ...
- [C++ Primer Plus] 第2章、开始学习c++
一.程序清单2.1(代码和书略不一样) #include<iostream> using namespace std;//使用std这个命名空间,才能正确找到cin和cout,如果不使用命 ...
- 20145325张梓靖 《网络对抗技术》 Web安全基础实践
20145325张梓靖 <网络对抗技术> Web安全基础实践 实验内容 使用webgoat进行XSS攻击.CSRF攻击.SQL注入 XSS攻击:Stored XSS Attacks.Ref ...
- 如何使用AsyncTask
1 如何使用handler,安卓规定只能再UI线程里面刷新UI,但是不能再UI线程里面执行耗时操作.所以我们要把耗时操作放在子线程里,然后把要刷新UI的操作传递到handler里面,然后在由Handl ...
- Manjaro kde 18.0安装与基本配置
目录 更换源镜像.更新系统 安装搜狗输入法 安装软件 系统配置 最后清理垃圾 首先用Rufus制作启动U盘安装,设置好时间和日期等 更换源镜像.更新系统 排列源(只选清华源mirrors.tuna.t ...
- SCU 4445 Right turn(dfs)题解
思路:离散化之后,直接模拟就行,标记vis开三维 代码: #include<iostream> #include<algorithm> #include<cstdio&g ...