在未排序的數組中找到第 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));
}
}
運行結果如下:

以上就是我對這個題目的解答,用來三種排序,其實也可以有其他的排序都可以。如果有需要,請自行完成,我就不一一列舉了。
