The first solution, the easiest one, time complexity: O(nlog(n))

    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        if(k<=nums.length)
            return nums[nums.length-k];
        else
            return -1;
    }

The second solution, using priority queue, time complexity: O(n*klog(k))

    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> q = new PriorityQueue<>();
        for(int i:nums){
            q.offer(i);
            if(q.size()>k)
                q.poll();
        }
        return q.peek();
    }

The third soltuion, quick sort the nums, and then return the kth largest num, average time complexity: O(n), the following is a typical quick sort template:

    public int findKthLargest(int[] nums, int k) {
        quicksort(nums, 0, nums.length - 1);
        return nums[nums.length - k];
    }

    public void quicksort(int[] nums, int start, int end) {
        if (start >= end)
            return;
        int i = start, j = end, mid = (i + j) / 2;
        int midNum = nums[mid];
        while (i <= j) {
            while (i <= j && nums[i] < midNum) {
                i++;
            }
            while (i <= j && nums[j] > midNum) {
                j--;
            }
            if (i <= j) {
                swap(nums, i, j);
                i++;
                j--;
            }
        }
        quicksort(nums, start, j);
        quicksort(nums, i, end);
    }

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

 

posted on 2022-02-09 07:39  阳光明媚的菲越  阅读(17)  评论(0编辑  收藏  举报