[英]Java 8 : How to find kth smallest, efficiently
在Java 8中,如何有效地找到最小的Kth? Kth最小為
http://www.geeksforgeeks.org/kth-smallestlargest-element-unsorted-array/
我在下面嘗試過。 如果有一個更有效的解決方案可以提供Java-8的安全性,例如在空數組等情況下訪問索引之前,我不必檢查大小。我相信我自己的解決方案對於空數組是安全的。
如果存在我的Java-8方法和更好的Java-8方法的可證明的時間復雜度比較 ,將不勝感激。 謝謝。
package lab.rat.jerry.kthsmallest;
import static java.util.stream.Collectors.toList;
import java.util.Arrays;
import java.util.List;
public class KthSmallest {
// Inputs
static int k = 3;
static Integer[] myIntArray = {2, 3, 1, 4, -2, 0, -3, 0, -1, 5 };
public static void main(String[] args) {
List<Integer> list = Arrays.asList(myIntArray);
System.out.println(list
.stream()
.sorted()
.distinct()
.limit(k)
.skip(k-1)
.collect(toList())
);
}
}
您可以在Java中使用簡單的數據結構PrioretyQueue
。 您可以快速獲取和刪除最大或最小元素:
public static int kthLargestElement(int[] nums, int k) {
PriorityQueue<Integer> queue = new PriorityQueue<>();
for (int i = 0; i < nums.length ; i++) {
queue.add(nums[i]);
}
while (k > 1){
queue.poll();
k-=1;
}
return queue.poll();
}
您可以嘗試以下方法:
package lab.rat.jerry.kthsmallest;
import java.util.Arrays;
import java.util.List;
public class KthSmallest {
// Inputs
static int k = 3;
static Integer[] myIntArray = {2, 3, 1, 4, -2, 0, -3, 0, -1, 5 };
public static void main(String[] args) {
List<Integer> list = Arrays.asList(myIntArray);
int smallest = list.stream()
.mapToInt(Integer::intValue)
.sorted()
.limit(k)
.skip(k-1)
.findFist()
.getAsInt();
System.out.println(smallest);
}
}
通過使用這種方法,可以避免NullPointerException。 因為findFist()
將返回可選的。
希望對您有所幫助:)
我不知道這樣做的效率如何,但在以下情況下需要考慮以下因素:
int k = 4;
int[] numbs = { 1, 2, 3, 3, 3, 3, 3, 3,10,11,12
};
int smallest =
Arrays.stream(numbs).distinct().sorted().skip(k - 1).limit(
1).findFirst().orElse(Integer.MIN_VALUE);
System.out.println(smallest);
如果k太大,則返回最小int值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.