在未排序的数组中找到第 k 个最大的元素

Posted 离愁i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在未排序的数组中找到第 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.215-数组中的第K个最大元素

215. 数组中的第K个最大元素

数组中的第K个最大元素--力扣

最大/最小de K个数/第K个数

排序和搜索----数组中的第K个最大元素

数组中的第K个最大元素