数组中第 K 大的元素

数组中第 K 大的元素

问题

这个题目说的是,给你一个整数数组和一个整数 K,你要找到数组中第 K 大的元素。

比如说,给你的整数数组是:

4, 2, 8, 1, 8

整数 K 是 2。这个数组中第 2 大的元素是 8,因此你要返回 8。

代码

public class AlgoCasts {

  // Time: O(n*log(k)), Space: O(k)
  public int findKthLargestMinHeap(int[] nums, int k) {
    Queue<Integer> minHeap = new PriorityQueue<>();
    for (int num: nums) {
      if (minHeap.size() < k) {
        minHeap.add(num);
      } else if (num > minHeap.peek()) {
        minHeap.poll();
        minHeap.add(num);
      }
    }
    return minHeap.peek();
  }

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

  int partition(int[] nums, int low, int high) {
    int pivot = nums[low], i = low, j = high;
    while (i < j) {
      while (i < j && nums[j] < pivot) --j;
      if (i < j) swap(nums, i, j);
      while (i < j && nums[i] >= pivot) ++i;
      if (i < j) swap(nums, i, j);
    }
    return i;
  }

  // Time(avg): O(n), Time(worst): O(n^2), Space: O(1)
  public int findKthLargestQuickSelect(int[] nums, int k) {
    int low = 0, high = nums.length - 1;
    while (low <= high) {
      int p = partition(nums, low, high);
      if (p == k-1) return nums[p];
      else if (p > k-1) high = p - 1;
      else low = p + 1;
    }
    return -1;
  }

}

  转载请注明: ForwardXu 数组中第 K 大的元素

 上一篇
有序数组中的单身数字 有序数组中的单身数字
有序数组中的单身数字问题 这个题目说的是,给你一个排好序的整数数组,里面的数字都出现两次,只有一个数字出现了一次,我们管它叫单身数字,你要写代码找到这个单身数字。 比如说给你的有序数组是: 1, 1, 2, 2, 4, 4, 6, 8,
2018-12-09
下一篇 
二叉搜索树中删除节点 二叉搜索树中删除节点
二叉搜索树中删除节点问题 这个题目说的是,给你一棵二叉搜索树和一个数值,你要删除二叉搜索树上等于这个数值的节点,然后返回处理后的二叉搜索树。 注意,二叉搜索树的节点上没有重复数值,并且要求删除节点后返回的仍然是二叉搜索树。 比如说,给你的二
2018-12-09
  目录