[程式設計題]查詢第K大的元素
阿新 • • 發佈:2019-09-02
給定一個無序的整型陣列A[n],陣列大小大於等於3,允許有值相同的元素;請設計演算法找到該陣列排序後第三大的元素值並輸出.
輸入描述:
一個非空的整數陣列(至少有3個元素,可正可負)
輸出描述:
第三大的元素值
示例1
輸入 [1,2,3,4,5] 輸出 3
示例2
輸入 [1,1,2,2,3] 輸出 2
連結:https://www.nowcoder.com/questionTerminal/673454422d1b4a168aed31e449d87c00
來源:牛客網
import java.util.PriorityQueue;
import java.util.Scanner;
import static java.lang.Integer.parseInt;
import static java.lang.System.in;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(in);
String[] str = sc.nextLine().replace("[", "").replace("]", "").split(",");
int[] data = new int[str.length];
for (int i = 0; i < data.length; i++) {
data[i] = parseInt(str[i]);
}
System.out.println(findKthNum(data, 3));
System.out.println(findKthNum1(data, 3));
}
//方法1,基於快排思想的partion劃分,時間複雜度O(n),空間複雜度O(1)
public static int findKthNum(int[] data, int k) {
int begin = 0, end = data.length - 1;
int pos = 0;
while (begin <= end) {
pos = partion(data, begin, end);
if (pos == k - 1) {
return data[pos];
} else if (pos > k - 1) {
end = pos - 1;
} else {
begin = pos + 1;
}
}
return -1;
}
private static int partion(int[] data, int begin, int end) {
int temp = data[begin];
while (begin < end) {
while (begin < end && data[end] <= temp) {
end--;
}
swap(data, begin, end);
while (begin < end && data[begin] > temp) {
begin++;
}
swap(data, begin, end);
}
return begin;
}
public static void swap(int[] arr, int i, int j) {
if (arr == null || i >= arr.length || j >= arr.length || i < 0 || j < 0) {
return;
}
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//方法2,建小頂堆,時間複雜度O(n*logk),空間複雜度O(k)
public static int findKthNum1(int data[], int k) {
PriorityQueue<Integer> heap = new PriorityQueue<>();
for (int item : data) {
if (heap.size() < k) {
heap.add(item);
} else if (item > heap.peek()) {
heap.poll();
heap.add(item);
}
}
return heap.poll