给定整数数组?nums
?和整数?k
,请返回数组中第?k
?个最大的元素。
请注意,你需要找的是数组排序后的第?k
?个最大的元素,而不是第?k
?个不同的元素。
你必须设计并实现时间复杂度为?O(n)
?的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4], k = 2 输出: 5
示例?2:
输入: [3,2,3,1,2,4,5,5,6], k = 4 输出: 4
提示:
1 <= k <= nums.length <= 105
-104?<= nums[i] <= 104
方法1:? 简单方法用时少,第二个方法有的案例超时
public static int findKthLargest(int[] nums, int k) {
// 方法1:
// Arrays.sort(nums);
// System.out.println(nums[nums.length - k]);
// 方法2:超时
ArrayList<Integer> list = new ArrayList<>();
Stack<Integer> stack = new Stack<>();
for (int num : nums) {
if (stack.size() == 0 || num > stack.peek()){
stack.push(num);
}else {
while (stack.size() > 0 && num < stack.peek()){
list.add(stack.pop());
}
stack.push(num);
int index = list.size() - 1;
while (index >= 0){
stack.push(list.get(index--));
if (index == -1){
list.clear();
}
}
}
}
int index = 0;
while (true){
if (index == k - 1){
break;
}
index++;
stack.pop();
}
return stack.peek();
}
方法2:
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> {
return b - a;
});
for (int i : nums) {
queue.add(i);
}
int result = 0;
for (int i = 0; i < k; i++) {
result = queue.poll();
}
return result;
}