堆排序做的,没有全部排序,找到第k个就结束

  1. public int findKthLargest(int[] nums, int k) {
  2. int num = 0;
  3. if (nums.length <= 1)
  4. return nums[0];
  5. int heapSize = nums.length;
  6. //1.构建最大堆
  7. int half = (heapSize-2)/2;
  8. for (int i = half;i >= 0;i--)
  9. {
  10. adjust(nums,heapSize,i);
  11. }
  12. while (heapSize > 1)
  13. {
  14. //2.取出最大值
  15. swap(0,heapSize-1,nums);
  16. heapSize--;
  17. num++;
  18. if(num == k)
  19. break;
  20. //3.调整堆
  21. adjust(nums,heapSize,0);
  22. }
  23. return nums[nums.length-k];
  24. }
  25.  
  26. public void adjust(int[] nums,int heapSize,int index)
  27. {
  28. int left = index*2+1;
  29. int right = index*2+2;
  30. int biggest = index;
  31. if (left < heapSize && nums[left] > nums[biggest])
  32. biggest = left;
  33. //注意这里都是和nums[biggest]比较,别写成index,因为要找出最大的值
  34. if (right < heapSize && nums[right] > nums[biggest])
  35. biggest = right;
  36. if (biggest != index)
  37. {
  38. swap(index,biggest,nums);
  39. adjust(nums,heapSize,biggest);
  40. }
  41. }
  42. public void swap(int a,int b,int[] nums)
  43. {
  44. int temp = nums[a];
  45. nums[a] = nums[b];
  46. nums[b] = temp;
  47. }

堆排序的算法时间复杂度是:O(n*log k )

下边快排的改进做法,O(n)

利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:

           1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
           2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)
  1. public void findk(int[] nums,int sta,int end,int k)
  2. {
  3. if (sta>end) return;
  4. Random random = new Random();
  5. int p = random.nextInt(end-sta)+sta;
  6. swap(nums,p,sta);
  7. int l = sta;
  8. int r = end;
  9. while (l<r)
  10. {
  11. while (l<r&&nums[r]>=nums[sta])
  12. r--;
  13. while (l<r&&nums[l]<=nums[sta])
  14. l++;
  15. swap(nums,l,r);
  16.  
  17. }
  18. swap(nums,l,sta);
  19. //记录右边数组(包括排序好的数)的大小
  20. int size = end-l+1;
  21. if (size == k) System.out.println(nums[l]);
  22. else if (size<k) findk(nums,sta,l-1,k-size);
  23. else findk(nums,l,end,k);
  24. }
  25. public void swap(int[] nums,int i ,int j)
  26. {
  27. int temp = nums[i];
  28. nums[i] = nums[j];
  29. nums[j] = temp;
  30. }

215. Kth Largest Element in an Array找出数组中第k大的值的更多相关文章

  1. 前端算法题:找出数组中第k大的数字出现多少次

    题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...

  2. 【LeetCode】215. Kth Largest Element in an Array 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:移除最大值 方法二:排序 方法三:大顶堆 方 ...

  3. 网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array

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

  4. leetcode 215. Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  5. 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)

    注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...

  6. LN : leetcode 215 Kth Largest Element in an Array

    lc 215 Kth Largest Element in an Array 215 Kth Largest Element in an Array Find the kth largest elem ...

  7. LeetCode OJ 215. Kth Largest Element in an Array 堆排序求解

    题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/ 215. Kth Largest Element in an A ...

  8. [LeetCode] 215. Kth Largest Element in an Array 数组中第k大的数字

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  9. 【LeetCode】215. Kth Largest Element in an Array (2 solutions)

    Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...

随机推荐

  1. 蒲公英 · JELLY技术周刊 Vol.32: 前端的自我进化之路

    蒲公英 · JELLY技术周刊 Vol.32 前端开发不过是切图仔在那儿瞎鼓捣,没啥门槛,不需要懂计算机原理,不需要懂算法,微服务.高并发这些都不需要懂,拖组件写个页面就好了,数据.逻辑.测试都可以交 ...

  2. LeetCode 026 Remove Duplicates from Sorted Array

    题目描述:Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such t ...

  3. python数据更新

    def cal(s,m): if s==u"废弃" or s==u"拆除": return 4 elif s==u"竣工": return ...

  4. DRF的ModelSerializer的使用

    在views中添加 from django.shortcuts import render # Create your views here. from rest_framework.views im ...

  5. dart时间处理的几个方法

    一.时间处理的方法 1.获取当前时间 new DateTime.now(); 2.设置时间 new DateTime(2020, 11, 11, 12, 37 , 36); 3.解析时间 DateTi ...

  6. PyQt(Python+Qt)学习随笔:QTableWidget的属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.概述 除了从父类继承的属性外,在Designer中QTableWidget只有两个属性,就是行数 ...

  7. Python正则表达式\W+和\W*匹配过程的深入分析

    在学习re.split函数的处理过程中,发现执行如下语句及返回与老猿预想的不一致: >>> re.split('\W*','Hello,world') ['', 'H', 'e', ...

  8. Python+Qt学习随笔:PyQt图形界面应用的事件处理流程

    图形界面的事件处理是界面操作的核心,经过编写测试程序验证,基本确认PyQt图形界面应用程序的事件处理流程如下: 1.操作系统或其他应用发送消息给应用主程序: 2.应用主程序调用notify将消息队列中 ...

  9. Springboot集成swagger和knife

    前言 knife4j是在swagger的基本上做做了一次封装,主要体现在ui表现,所有在使用前必须先搭建好swagger2,其实是swagger和knife都可以访问, 至于哪个好用全看个人! swa ...

  10. ASP数据库连接方法语法总结

    经常使用到有关数据库的操作.包括连接代码,SQL命令等等,又不曾刻意去记忆它们(我本人是不愿意去记这东东),所以常常在用到的时候又去查书本,翻来翻去.一些比较少用的数据库还不一定能顺利找到,所以现在把 ...