在未排序的數組中找到第 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)); } }

運行結果如下:

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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM