• 算法通关村第十关-白银挑战数组最大K数


    大家好我是苏麟 , 今天带来一道应用快排的题 .

    数组中的第K个最大元素 

    描述 :

    给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

    请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

    题目 :

    LeetCode 215.数组中的第K个最大元素 :

    215. 数组中的第K个最大元素

    分析 :

    这道题基于快排完成 , 快排教程 :

    算法通关村第十关-青铜挑战快速排序-CSDN博客

    这道题还有一个地方就是K这 , 举例 :数组 num =  [1,2,3,4,5,6,7,8,9] 一个升序的数组 找第1个大的值就是 9 ,就找 9 的下标 也就是 num.length - k , 懂了这里我们看一下下面的代码 :

    1. if(i < k){
    2. return sort(nums,i + 1,right,k);
    3. }else{
    4. return sort(nums,left,i - 1,k);
    5. }

     i 这里就是中间值 , 在 i 左边的都比 num[i] 小 , 在 i 右边的都比num[i] 大 , 所以要找第一大的就在 i 右边找就好了 , 因为左边都是比num[i] 小的 ......  这里也懂了的话就题就完事了 , 这题还是有些难度的 .

    用双边快排

    解析 :

    1. class Solution {
    2. public int findKthLargest(int[] nums,int k) {
    3. int length = nums.length;
    4. return sort(nums,0,length - 1,length - k);
    5. }
    6. public int sort(int[] nums,int left,int right,int k){
    7. int i = qicke(nums,left,right);
    8. if(i == k){
    9. return nums[k];
    10. }
    11. if(i < k){
    12. return sort(nums,i + 1 , right ,k);
    13. }else{
    14. return sort(nums,left,i - 1,k);
    15. }
    16. // sort(nums,left,i - 1,k);
    17. // sort(nums,i + 1,right,k);
    18. }
    19. public int qicke(int[] nums,int left,int right){
    20. int i = left;
    21. int j = right;
    22. int p = nums[left];
    23. while(i < j){
    24. while(i < j && nums[j] > p){
    25. j--;
    26. }
    27. while(i < j && nums[i] <= p){
    28. i++;
    29. }
    30. swap(nums,i,j);
    31. }
    32. swap(nums,i,left);
    33. return i;
    34. }
    35. public void swap(int[]nums,int i,int j){
    36. int temp = nums[i];
    37. nums[i]=nums[j];
    38. nums[j]=temp;
    39. }
    40. }

    分析 :

    用单边快排

    解析 :

    1. class Solution {
    2. public int findKthLargest(int[] nums, int k) {
    3. int n = nums.length;
    4. return sort(nums,0,n - 1,n - k);
    5. }
    6. public int sort(int[] nums,int left,int right,int k){
    7. int i = qicke(nums,left,right,k);
    8. if(i == k){
    9. return nums[k];
    10. }
    11. if(i < k){
    12. return sort(nums,i + 1,right,k);
    13. }else{
    14. return sort(nums,left,i - 1,k);
    15. }
    16. }
    17. public int qicke(int[] nums,int left,int right,int k){
    18. int i = left;
    19. int j = left;
    20. int p = nums[right];
    21. while(j < right){
    22. if(nums[j] < p){
    23. if(i != j){
    24. swap(nums,i,j);
    25. }
    26. i++;
    27. }
    28. j++;
    29. }
    30. swap(nums,i,right);
    31. return i;
    32. }
    33. public void swap(int[]nums,int i,int j){
    34. int temp = nums[i];
    35. nums[i]=nums[j];
    36. nums[j]=temp;
    37. }
    38. }

    这题需要大家好好理解 , 并独立写出来 . 

    这道题 , 我也是弄了很久 ,下面是我的提交记录(太惨了) , 希望大家做的又快又对 ......

    这期就到这里 , 下期见!

  • 相关阅读:
    什么是继承?什么是组合?为何说要多用组合少用继承?
    1.centos7安装docker
    外贸业务员如何通过google搜索多个关键词批量提取客户网址?
    m1芯片-centos安装mysql
    JUC三大常用工具类CountDownLatch、CyclicBarrier、Semaphore
    mybatis的延迟加载原理是什么呢?
    【目标跟踪】|SiamFC
    Django-图书管理系统(含源码)
    一篇文章就足够解决大数据实时面试
    二、链表(linked-list)
  • 原文地址:https://blog.csdn.net/sytdsqzr/article/details/134480010