在未排序的数组中找到第 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)); } }
运行结果如下:
以上就是我对这个题目的解答,用来三种排序,其实也可以有其他的排序都可以。如果有需要,请自行完成,我就不一一列举了。