LeetCode 215 : Kth Largest Element in an Array

我只是一个虾纸丫 提交于 2020-03-27 02:41:46

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.

 

最简单的想法:先排序,然后倒数k个元素就是

时间复杂度:O(nlogn)

public class Solution {
    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        return nums[nums.length-k];
    }
}

 

优化:quicksort 中 partition 的思想

就像quickselect一样,时间复杂度应该是 O(n)

public class Solution {
    public int findKthLargest(int[] nums, int k) {
        return helper(nums, 0, nums.length-1, k);
    }
    
    public int helper(int[] nums, int lo, int hi, int k) {
        // if (lo == hi)
        //     return nums[lo];
            
        int partition = nums[lo];
        int j = hi;
        for (int i = lo+1; i <= j;) {
            while (i <= hi && nums[i] < partition) i++;
            while (j >= lo && nums[j] > partition) j--;
            if (i <= j) {
                swap(nums, i, j);
                i++; j--;
            }
        }
        swap(nums, j, lo);

        if (k == hi - j + 1)
            return nums[j];
        if (k < hi - j + 1)
            return helper(nums, j + 1, hi, k);
        else
            return helper(nums, lo, j - 1, k - (hi - j + 1));
    }
    
    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

 

 

2015-10-21

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!