什么是数组的第k个最小元素?

时间:2018-03-20 23:20:36

标签: algorithm

这是我正在做的练习的前提,但我不知道数组的第k个元素是什么。

例如,练习会询问以下输入/输出: 输入:[7,2,1,6,1]和k = 3 输出:6

我只是不知道K和数组之间的关系。

4 个答案:

答案 0 :(得分:3)

我认为这个问题要求你在考虑重复的情况下返回数组中的第三个最小数字。 例如:[4,5,2,7,8], 3应返回5,而在您的情况下,它应返回6

import java.util.Comparator;
import java.util.PriorityQueue;

public class FindKthSmallest {
  public static void main(String[] args) {
    int[] arr = new int[]{7,2,1,6,1};
    FindKthSmallest f = new FindKthSmallest();
    System.out.println(f.findKthSmall(arr, 3));
  }

  public int findKthSmall(int[] nums, int k) {
    if (nums == null || nums.length == 0 || k == 0) {
      return -1;
    }

    PriorityQueue<Integer> pq = new PriorityQueue<Integer>(new Comparator<Integer>() {
      @Override
      public int compare(Integer i, Integer j) {
        return j - i;
      }
    });

    for (int i : nums) {
      if (pq.contains(i)) {
        continue;
      }
      pq.offer(i);
      if (pq.size() > k) {
        pq.poll();
      }
    }

    return pq.peek();
  }
}

答案 1 :(得分:0)

K只是一个数字,在此示例中为K'th smallest element。因此,如果K为2,那么您正在寻找2'nd smallest element

答案 2 :(得分:0)

k = 3表示您需要数组中的第3个最小元素。但是我不明白结果:

第一小:1    第二小:1(其他 1)    第三小:2    第四小:6

然而,当我们以原始顺序讨论数组元素时,k元素是位置k中的元素。例如,如果你有

arr = [7, 2, 1, 6, 1]

然后第3个元素是1(第一个)。但是,如果您的数组索引从0开始,则arr[k]arr[3]6

那是否会使这个问题成为死刑?

答案 3 :(得分:0)

如果您有信心,那么不同元素的数量就足够了:

scala> val arr = Array (7,2,1,6,1)
arr: Array[Int] = Array(7, 2, 1, 6, 1)

scala> arr.distinct.sorted.take(3).last
res85: Int = 6

然而,

scala> arr.distinct.sorted.take(103).last

将返回最后一个元素,即7但不是正确答案,因此您需要进行一些检查,以返回Option [Int]。或者使用Try(scala.util.Try)

Try {arr.distinct.sorted.toList (5)}    
res92: scala.util.Try[Int] = Failure(java.lang.IndexOutOfBoundsException: 5)
scala> Try {arr.distinct.sorted.toList (2)}
res94: scala.util.Try[Int] = Success(6)

由于索引从0开始,我们必须查找索引2,以获得第3个元素。