在未排序的数组中找到第 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示 ...
随机推荐
- 远程图片转化为base64
远程图片转化为base64 <?php /* * * 第一种方法 * 远程图片转化为base64,只支持http(推荐使用) * */ public static function imgUrl ...
- Golang并发编程中select简单了解
select可以监听channel的数据流动select的用法与switch语法非常类似,由select开始的一个新的选择块,每个选择条件由case语句来描述 与switch语句可以选择任何使用相等比 ...
- P2147 [SDOI2008]洞穴勘测(LCT)
P2147 [SDOI2008]洞穴勘测 裸的LCT. #include<iostream> #include<cstdio> #include<cstring> ...
- P1290 欧几里德的游戏
P1290 欧几里德的游戏 原本不想写的,但细节有些多qwq,还是放上吧. 假设a严格大于b 当a<b*2时,只有一种方法往下走:否则就可以有多种方法,并且一定至少有一种可以使自己必胜,因为可以 ...
- python简说(五)操作文件
f = open('users.txt',encoding='utf-8') #读文件的时候,必须存在在才可以读 文件对象,或者文件句柄res = f.read()print(res)f.close( ...
- 使用vim打造自己的python编辑器
基础配置 vim的配置是在用户主目录下的 ~/.vimrc 文件中完成的,如果没有的话,需要自己新建一下: cd ~ touch .vimrc 首先做些简单的配置: set nocompatible ...
- Google Protocol Buffer在vs2010下配置
1.从这里下载protobuf-2.6.1.tar.gz到桌面,并解压,解压后的文件夹为protobuf-2.6.1.(我的桌面为C:\Users\mcl\Desktop) 2 .进入文件夹proto ...
- Oracle常用函数——COALESCE
COALESCE 含义:COALESCE是一个函数, (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值 ...
- ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) A
2018-02-19 A. Palindromic Supersequence time limit per test 2 seconds memory limit per test 256 mega ...
- C语言goto语句的使用
不使用goto语句: 使用goto语句: 使用goto语句时需要注意以下原则:1) 不要过份地使用.比如图2中的60行就没有采用goto语句跳到程序的最后面,之所以这里不使用goto是为了阅读方便.因 ...