// LeetCode指定调用方法 publicintfindKthLargest(int[] nums, int k){ int len = nums.length; createBigHeap(nums, len);
// 通过大顶堆排序,找出第 k个最大的元素 for (int i = 1; i <= k; i++) { int temp = nums[len - i]; nums[len - i] = nums[0]; nums[0] = temp; adjustBigHeap(nums, 0, len - i); }
return nums[len - k]; }
// 创建大顶堆 publicvoidcreateBigHeap(int[] nums, int len){ for (int i = len / 2 - 1; i >= 0; i--) { //从第一个非叶子结点从下至上,从右至左调整结构 adjustBigHeap(nums, i, len); } }
// 调整大顶堆 publicvoidadjustBigHeap(int[] nums, int i, int len){ int temp = nums[i]; for(int j = i * 2 + 1; j < len; j = j * 2 + 1){ // 遍历从i开始的左子节点,左子节点的左子节点 if(j + 1 < len && nums[j] < nums[j + 1]){ // 如果左子结点小于右子结点,则将子节点指针j指向右子结点 j++; } if(nums[j] > temp){ // 如果子节点大于父节点,将子节点值赋给父节点,并将父节点指针i指向该子节点 nums[i] = nums[j]; i = j; }else{ break; } } nums[i] = temp; }