0
点赞
收藏
分享

微信扫一扫

力扣215.数组中的第K个最大元素

吓死我了_1799 2022-04-03 阅读 203
java

215.数组中的第K个最大元素

思路1:

使用冒泡排序排序好后并根据索引返回即可

代码实现

class Solution {
    public int findKthLargest(int[] nums, int k) {
		int tmp = 0;
		for (int i = 0; i < nums.length - 1; i++) {
			for (int j = 0; j < nums.length - i - 1; j++) {
				if (nums[j] < nums[j + 1]) {
					tmp = nums[j];
					nums[j] = nums[j + 1];
					nums[j + 1] = tmp;
				}
			}
		}
		return nums[k - 1];
	}
}

思路2:

直接调用Arrays的sort方法排序并根据索引返回

代码实现

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

思路3:

使用优先队列完成

代码实现

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        for (int i = 0; i < nums.length; i++) {
        	queue.offer(nums[i]);
        	if (queue.size() > k) queue.poll();
        }
        return queue.peek();
    }
}

思路4:

使用堆排序

代码实现

class Solution {
    public int findKthLargest(int[] nums, int k) {
		heapSort(nums);
		return nums[nums.length - k];
	}
	
	private static void heapSort(int[] nums) {
        //创建堆
        for (int i = (nums.length - 1) / 2; i >= 0; i--) {
            //从第一个非叶子结点从下至上,从右至左调整结构
            adjustHeap(nums, i, nums.length);
        }

        //调整堆结构+交换堆顶元素与末尾元素
        for (int i = nums.length - 1; i > 0; i--) {
            //将堆顶元素与末尾元素进行交换
            int temp = nums[i];
            nums[i] = nums[0];
            nums[0] = temp;

            //重新对堆进行调整
            adjustHeap(nums, 0, i);
        }
    }

    /**
     * 调整堆
     * @param nums 待排序列
     * @param parent 父节点
     * @param length 待排序列尾元素索引
     */
    private static void adjustHeap(int[] nums, int parent, int length) {
        //将temp作为父节点
        int temp = nums[parent];
        //左孩子
        int lChild = 2 * parent + 1;

        while (lChild < length) {
            //右孩子
            int rChild = lChild + 1;
            // 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
            if (rChild < length && nums[lChild] < nums[rChild]) {
                lChild++;
            }

            // 如果父结点的值已经大于孩子结点的值,则直接结束
            if (temp >= nums[lChild]) {
                break;
            }

            // 把孩子结点的值赋给父结点
            nums[parent] = nums[lChild];

            //选取孩子结点的左孩子结点,继续向下筛选
            parent = lChild;
            lChild = 2 * lChild + 1;
        }
        nums[parent] = temp;
    }
}
举报

相关推荐

0 条评论