215.Kth Largest Element in an Array

数组中第k大的元素


两种思想:

1.首先是直接排序,调用sort方法实现

  • java
class Solution {
    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        return nums[nums.length-k];
    }
}
  • javascript
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
     nums.sort(sortNumber);
        return nums[nums.length-k];
};

function sortNumber(a,b){
    return a-b;
}

2.利用快速排序法的思想实现

  • 回顾快速排序法
private void quicksort(int[] list,int start,int end) {
        //记住必须end>start
        if(end>=start){
            int piord=list[start];
            int low=start+1;
            int high=end;
            while(low<high){
                //找到左边第一个比piord大的数
                while(low<=high&&list[low]<piord)
                    low++;
                while(low<=high&&list[high]>piord)
                    high--;
                if(low<high)
                    swap(list,low,high);

            }
            //执行完循环后,找到第一个小于piord的数,和第一个数交换位置
            while(high>start&&list[high]>=piord)
                high--;
            if(list[high]<piord)
                swap(list,start,high);
            //左半边快排
            quicksort(list,start,high-1);
            //右半边快排
            quicksort(list,high+1,end);
        }

    }

    private void swap(int[] list, int i, int j) {
        int temp=list[i];
        list[i]=list[j];
        list[j]=temp;
    }

思想:重点是快速排序算法一次定一个位置,如果定下的位置就是n-k(从小到大排,n-k的位置就是第k大的位置),直接返回n-k的内容,如果定下的位置<n-k,就要在右边进行快排,如果定下的位置>n-k,就要在左边进行快排。

  • java实现
class Solution {
    public int findKthLargest(int[] nums, int k) {
       return findKthLargest(nums,0,nums.length-1,k);   
    }
    
    public int findKthLargest(int[] nums,int start,int end,int k){
        if(start<=end){
            int pivot=nums[start];
            int low=start+1;
            int high=end;
            while(low<high){
                 //找到第一个大于pivot的索引
                //注意这里必须要有等于号,因为在所有数字都相等时,只要让low和high指向末尾元素即可。
                while(low<=high&&nums[low]<=pivot)
                    low++;
                //找到第一个小于pivot的索引
                while(low<=high&&nums[high]>pivot)
                    high--;
                if(low<high)
                   swap(nums,low,high);
            }
            
            while(start<high&&nums[high]>=pivot)
                high--;
            if(nums[high]<pivot)
                swap(nums,start,high);
            
            if(high==nums.length-k)
                return nums[high];
            else if(high<nums.length-k)
                //如果定出来的位置小于nums.length-k,就在右半边快排
                return findKthLargest(nums,high+1,end,k);
                //如果定出来的位置大于nums.length-k,就在左半边快排
            else
                return findKthLargest(nums,start,high-1,k);
           
        }
        
        return Integer.MAX_VALUE;
    }
    
    public void swap(int[] nums,int low,int high){
        int temp=nums[low];
        nums[low]=nums[high];
        nums[high]=temp;
    }
}
  • javascript实现
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    return findK(nums,0,nums.length-1,k);
};

var findK=function(nums,start,end,k){
    //注意,必须有等号,应对只有一个元素的情况
    if(start<=end){
        var pivot=nums[start];
        var low=start+1;
        var high=end;
        while(low<high){
            //注意必须有等号,应对所有元素均相等的情况,让low指向最后一个元素
            while(low<=high&&nums[low]<=pivot)
                low++;
            //让high也指向最后一个元素
            while(low<=high&&nums[high]>pivot)
                high--;
            if(low<high)
                swap(nums,low,high);
        }
        //找到小于pivot的第一个元素
        while(high>start&&nums[high]>=pivot)
            high--;
        if(nums[high]<pivot)
            swap(nums,start,high);
        if(high==nums.length-k)
            return nums[high];
        else if(high<nums.length-k)
            return findK(nums,high+1,end,k);
        else
            return findK(nums,start,high-1,k);
    }
}

var swap=function(nums,low,high){
    var temp=nums[low];
    nums[low]=nums[high];
    nums[high]=temp;
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容