Kth Largest Element详解编程语言

Find K-th largest element in an array. 
 
Example 
In array [9,3,2,4,8], the 3rd largest element is 4. 
 
In array [1,2,3,4,5], the 1st largest element is 5, 
2nd largest element is 4, 3rd largest element is 3 and etc. 
 
Note 
You can swap elements in the array 
 
Challenge 
O(n) time, O(1) extra memory.

找第 K 大数,基于比较的排序的方法时间复杂度为 O(n), 数组元素无区间限定,故无法使用线性排序。由于只是需要找第 K 大数,这种类型的题通常需要使用快排的思想解决。Quick Sort 总结了一些经典模板。这里比较基准值最后的位置的索引值和 K 的大小关系即可递归求解。

JAVA:

class Solution { 
    //param k : description of k 
    //param numbers : array of numbers 
    //return: description of return 
    public int kthLargestElement(int k, ArrayList<Integer> numbers) { 
        if (numbers == null || numbers.isEmpty()) return -1; 
 
        int result = qSort(numbers, 0, numbers.size() - 1, k); 
        return result; 
    } 
 
    private int qSort(ArrayList<Integer> nums, int l, int u, int k) { 
        // l should not greater than u 
        if (l >= u) return nums.get(u); 
 
        // index m of nums 
        int m = l; 
        for (int i = l + 1; i <= u; i++) { 
            if (nums.get(i) > nums.get(l)) { 
                m++; 
                Collections.swap(nums, m, i); 
            } 
        } 
        Collections.swap(nums, m, l); 
 
        if (m + 1 == k) { 
            return nums.get(m); 
        } else if (m + 1 > k) { 
            return qSort(nums, l, m - 1, k); 
        } else { 
            return qSort(nums, m + 1, u, k); 
        } 
    } 
}

源码分析

递归的终止条件有两个,一个是左边界的值等于右边界(实际中其实不会有 l > u), 另一个则是索引值 m + 1 == k.这里找的是第 K 大数,故为降序排列,for 循环中使用nums.get(i) > nums.get(l) 而不是小于号。

复杂度分析

最坏情况下需要遍历 n + n – 1 + … + 1 = O(n^2), 平均情况下 n+n/2+n/4+…+1=O(2n)=O(n). 故平均情况时间复杂度为 O(n). 交换数组的值时使用了额外空间,空间复杂度 O(1).

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20721.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论