簡體   English   中英

Java 8:如何高效找到最小的第k個

[英]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()將返回可選的。

希望對您有所幫助:)

我不知道這樣做的效率如何,但在以下情況下需要考慮以下因素:

  1. 該數組包含重復值。
  2. k大於最終列表。
      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);
  1. 這會將數組轉換為流。
  2. 刪除重復項
  3. 整理剩下的東西。
  4. 跳過前k-1個值。
  5. 將列表的其余部分限制為一個
  6. 返回它。

如果k太大,則返回最小int值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM