题目描述

给定一个数组A,要求找到数组A中第K大的数字。

思路:对于这种题目,其实有多种解法

方法1:对数组A进行排序,然后遍历一遍就可以找到第K大的数字。该方法的时间复杂度为O(N*logN)

方法2:利用简单选择排序法的思想,每次通过比较选出最大的数字来,比较上K次就能找出第K大的数字来。该方法的时间复杂度为O(N*K),最坏情况下为O(N^2)。

方法3:也是本文介绍的最重要的一种方法。利用快速排序算法 partition 的思想来解决。首先快排每次执行都能确定一个元素的最终的位置,如果这个位置是n-k(其中n是数组A的长度)的话,那么就相当于找到了第K大的元素。设确定的元素位置m的话,如果m 在 n-k 的右边的话,即 m > n - k,那么第K大的数字一定在m的左边,即A[0]~A[m - 1]之间;如果m在 n-k 的左边的话,即 m < n - k,那么第K大的数字一定在m的右边,即A[m+1]~A[n - 1]之间。整个过程可以通过递归实现,具体代码如下:

public int KthElement(int[] arr, int k){int n = arr.length;if(arr == null || k > n)return 0;int start = 0;int end = n - 1;while(start <= end){int index = partition(arr,start,end);if(index == n - k)return arr[index];else if(index < (n-k))start = index + 1; else if(index > (n-k))end = index - 1;}/*while(index != n - k){if(index < (n-k)){ //在该元素的右边继续寻找start = index + 1; index = partition(arr,start,end);}if(index > (n-k)){//在该元素的左边继续寻找end = index - 1;index = partition(arr,start,end);}}return arr[index];
*/return 0;}public int partition(int[] arr, int start, int end){int i = start;int j = end;int key = arr[i];while(i < j){while(i < j && arr[j] >= key){j--;}arr[i] = arr[j];i++;while(i < j && arr[i] <= key){i++;}arr[j] = arr[i];j--;}arr[i] = key;return i;
}

特别注意:

1.第K大的数字在数组中对应的位置为n-k(按照升序排序的话)。

2.该算法的时间复杂度整体上为O(N)。

3.需要注意的是:这种方法会改变数组中元素的顺序,即会改变数组本身。

4.如果要求第K小的数字的话,只需把n-k换成k-1即可(升序排序)。

Leetcode215 寻找数组中第K大的数相关推荐

  1. 寻找数组中第k大的数

    题目:有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2 ...

  2. 寻找数组中第K大的数,时间复杂度O(N)

    给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 有道题目寻找第K大,我用这3种方法都做了一遍. 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大 ...

  3. python查找第k大的数_寻找数组中第K大的数

    给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大的数字.该方法的时间复杂度为O(N*logN) ...

  4. java查找第k大的数字_[经典算法题]寻找数组中第K大的数的方法总结

    今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以 ...

  5. java寻找数组中第k大的数

    快速排序思想,先找数组第k小的数,当执行一次partition函数找到index下标时,index左边的数比arr[index]小,右边的数比arr[index]大 public class Test ...

  6. Leetcode215数组中第k大的数-最小堆

    题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...

  7. java查找第k大的数字_查找数组中第k大的数

    问题:  查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...

  8. 找出数组中第k大的数

    给定一个数组,找出数组中第k大的数.其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* @author wjgs**/ public class Fi ...

  9. Java找出数组中第K大的数

    题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...

最新文章

  1. boost 线程、互斥体、条件变量
  2. if函数中的android,java - 我需要帮助将IF语句方法更改为Android Studio中的SWITCH情况 - 堆栈内存溢出...
  3. python装饰器实例-Python函数装饰器--实例讲解
  4. 源码阅读之Java栈的实现
  5. 问题 A: 喷水装置(一)
  6. Netty ObjectPool对象池技术原理分析
  7. Linux 环境变量 $PATH
  8. 复数类--重载运算符3+
  9. linux grub 串口,grub重定向到串口 - Emmoblin Blog
  10. sparkwordcount
  11. UVA - 10534
  12. oracle里的or 短路么,Oracle CASE短路不能分组工作
  13. supervisor 管理
  14. Android下最简单的AudioTrack播放PCM的例子
  15. Buses and People CodeForces 160E 三维偏序+线段树
  16. Android jetpack DataStore 1.0.0-rc02最新版从SharedPreferences迁移到Preferences DataStore
  17. [python]python的注释格式
  18. ink css,ink - 在线工具 - 前端之家
  19. 定时器 java qua_【spring-boot】 springboot整合quartz实现定时任务
  20. airtest常用按键

热门文章

  1. 你的代码是如何被炫技毁掉的
  2. 刚刚成立一年的华为云是怎么快速发展成为行业领导者的?
  3. 前端弹性布局flex讲解
  4. 企业数字化转型值得一看:送你高级配色方案,附赠多款酷炫大屏
  5. JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算...
  6. jq添加或移除class
  7. 微信小程序有关用户输入浮点数的限制
  8. 微信小程序实现单元格编辑功能,并支持计算合计
  9. 泡泡机器人SLAM公开课
  10. STM32的oneNet物联网远程智能家居控制系统-思路分享