zoukankan      html  css  js  c++  java
  • 在未排序的数组中找到第 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)); } }

    运行结果如下:

     以上就是我对这个题目的解答,用来三种排序,其实也可以有其他的排序都可以。如果有需要,请自行完成,我就不一一列举了。



  • 相关阅读:
    单例模式
    HashSet、LinkedHashSet、SortedSet、TreeSet
    ArrayList、LinkedList、CopyOnWriteArrayList
    HashMap、Hashtable、LinkedHashMap
    andrew ng machine learning week8 非监督学习
    andrew ng machine learning week7 支持向量机
    andrew ng machine learning week6 机器学习算法理论
    andrew ng machine learning week5 神经网络
    andrew ng machine learning week4 神经网络
    vue组件监听属性变化watch方法报[Vue warn]: Method "watch" has type "object" in the component definition. Did you reference the function correctly?
  • 原文地址:https://www.cnblogs.com/youdiaodaxue16/p/10708228.html
Copyright © 2011-2022 走看看