【LeetCode】215. 数组中的第K个最大元素(JAVA)

原题地址:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/

题目描述:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

解题方案:
代码:

计数排序(最快)

class Solution {
    public int findKthLargest(int[] nums, int k) {
        int maxNum = 0, minNum = nums[0];
        for(int i = 0; i <nums.length; i ++)
        {
            if(nums[i] > maxNum) maxNum = nums[i];
            if(nums[i] < minNum) minNum = nums[i];
        }
        int size = maxNum - minNum + 1;
        int[] numbers = new int[size];
        for(int i = 0; i < nums.length; i ++)
            numbers[nums[i] - minNum] ++;
        int i = size - 1, count = 0;
        for(; i >= 0; i --)
        {
            if(count + numbers[i] < k) count += numbers[i];
            else break;
        }
        return i + minNum;
    }
}

堆排序

class Solution {
    public int findKthLargest(int[] nums, int k) {
        for(int i = 1; i <= k; i ++)
        {
            int cur = (nums.length - i) / 2; //第一个要遍历的点
            while(cur >= 0)
            {
                int pos = cur;
                while(pos <= (nums.length - i) / 2)
                {
                    int newPos = pos * 2;
                    if(pos * 2 + 1 <= nums.length - i && nums[pos * 2 + 1] > nums[pos * 2])
                        newPos = pos * 2 + 1;
                    if(nums[pos] < nums[newPos])
                    {
                        int tmp = nums[newPos];
                        nums[newPos] = nums[pos];
                        nums[pos] = tmp;
                    }
                    else
                        break;
                }
                cur --;
            }
            int tmp = nums[0];
            nums[0] = nums[nums.length - i];
            nums[nums.length - i] = tmp;
        }
        return nums[nums.length - k];
    }
}

冒泡

class Solution {
    public int findKthLargest(int[] nums, int k) {
        for(int i = 1; i <= k; i ++)
        {
            for(int j = 0; j < nums.length - i; j ++)
            {
                if(nums[j] > nums[j + 1])
                {
                    int tmp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = tmp;
                }
            }
        }
        return nums[nums.length - k];
    }
}
发布了110 篇原创文章 · 获赞 4 · 访问量 9345

猜你喜欢

转载自blog.csdn.net/rabbitsockx/article/details/104321688