zoukankan      html  css  js  c++  java
  • 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 sorted order, not the kth distinct element.

    For example,
    Given [3,2,1,5,6,4] and k = 2, return 5.

    Note: 
    You may assume k is always valid, 1 ≤ k ≤ array's length.

    本题开始我用了数组排序的方法做,代码如下:

    public class Solution {

        public int findKthLargest(int[] nums, int k) {

            Arrays.sort(nums);

            int kth = 0;

            for(int i=nums.length-1;i>=0;i--){

                k--;

                if(k==0) kth = nums[i];

            }

            return kth;

        }

    }

    后来我又用了大顶堆的概念来做,代码如下:

    public class Solution {

        public int findKthLargest(int[] nums, int k) {

            PriorityQueue<Integer> q = new PriorityQueue<Integer>(nums.length,new Comparator<Integer>(){

                public int compare(Integer a,Integer b){

                    return b-a;

                }

            });

            for(int i:nums){

                q.offer(i);

            }

            k--;

            while(k>0){

                q.poll();

                k--;

            }

            return q.peek();

        }

    }

    大神用了快速排序法来做,很聪明的解题办法,代码如下:

    public class Solution {

        public int findKthLargest(int[] nums, int k) {

            int n = nums.length;

            int q = quickselect(nums,0,n-1,n-k+1);

            return nums[q];

        }

        public void swap(int[] nums,int i,int j){

            int temp = nums[i];

            nums[i] = nums[j];

            nums[j] = temp;

         }

         public int quickselect(int[] nums,int lo,int hi,int k){

             int pivot = nums[hi];

             int i = lo;

             int j = hi;

             while(i<j){

                 if(nums[i++]>pivot) swap(nums,--i,--j);

             }

             swap(nums,i,hi);

             int order = i-lo+1;

             if(order==k) return i;

             else if(order>k) return quickselect(nums,lo,i-1,k);

             else return quickselect(nums,i+1,hi,k-order);

         }

    }

  • 相关阅读:
    静态代码块、非静态代码块、构造函数之间的执行顺序
    Linux跨主机传输文件
    🗒 Linux 系统监控
    Mysql Mode
    Mysql 表锁行锁
    Centos 下修改时区
    Redis 解决内存过大
    Mysql 表达式
    Centos 二进制包安装Mysql5.7
    Vim 快捷键
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6360889.html
Copyright © 2011-2022 走看看