查找数组

时间:2015-12-15 01:12:39

标签: java arrays algorithm hashmap

这是一个较大的leetcode问题中的小算法。如果给定一个数组,比如[5,7,3,5,3,5,16,9],我希望我的代码按顺序返回数组的三个最大数字的位置。使用上面提到的数组,三个最大的数字将是7 ,从左到右的顺序,16和9。因此,该方法应返回[1,6,7]或三个数字所在的索引。

我现在已经考虑了很长一段时间,但我不知道该怎么做。我考虑过在代码中实现HashMaps来设置数组值和位置之间的区别,但我不确定如何实现这样的设计。任何帮助将不胜感激,谢谢!

修改

我找到了问题的解决方案。 FindBig3使用HashMap来记录给定数组中的索引及其中的值。

代码通过for循环从左到右遍历数组,并使用以下指令

  1. 从前三个数组值开始为"大3",存储在lo3 Hashmap
  2. 找到"最大值3" (使用findLeastValue方法)
  3. 检查for循环中的 i 值是否大于"大三"中的最小值,如果是,则从{{中删除最小值1}}并插入 i 值。
  4. 程序然后输出3个最大数字(lo3)的键集

    的位置
    lo3

2 个答案:

答案 0 :(得分:1)

使用nth_element,不在值数组上,而是在单独构造的索引数组上。 nth_element将顶部(或最小)K值移动到所有其他值的右侧。 nth_element的标准实现不会对整个数组进行排序,并且会给出O(n)时间复杂度。这正是您所需要的,您可以稍后以完全排序的顺序输出索引,这会增加从O(n)到O(n + k.log(k))的复杂性。

这个C ++例程也是如此。与排序类似,它需要一个自定义,它根据它们指向的元素的值对索引进行排序,并将前K个索引移动到位置0,... K-1。

#include <algorithm>

vector<int> TopKIndices(int k, vector<int32_t>& array) {
  vector<int> indices(array.size());
  int idx = 0;
  std::generate(indices.begin(), indices.end(), [&idx](){ return idx++; });
  if (k >= array.size()) {
    // All the indices are returned.
    return indices;
  }
  auto comp = [&array](const int ia, const int ib){
    return (array[ia] > array[ib]);
  };
  std::nth_element(indices.begin(), indices.begin() + k, indices.end(), comp);
  sort(indices.begin(), indices.begin() + k);
  return vector<int>(indices.begin(), indices.begin() + k);
}


// Test the code.
vector<int32_t> array = {5,7,3,5,3,5,16,9};
vector<int> ind = TopKIndices(3, array);
for (int i : ind) {
  printf("Top index = %d\n", i);
}

答案 1 :(得分:0)

所以你可以创建一个包含两个int变量的类:索引和元素值

解决方案#1:实现Comparable接口

创建实现类似界面的对象列表。此接口可以根据compareTo函数的实现对列表进行排序。您可以根据元素原始值对列表进行排序,然后制作一个小算法来比较三个最高的索引。 了解详情:https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

解决方案#2:使用优先级队列。

在优先级队列中,具有高优先级的元素在具有低优先级的元素之前提供。

您可以创建一个优先级队列,根据元素的值比较对象并弹出前三个。然后根据索引对它们进行排序。

检查此问题以获取优先级队列的示例实现:How do I use a PriorityQueue?

解决方案#3:混合可移植性

使用两个变量创建一个实现Comparable接口的类: index value

将数组的内容作为对象推入先前队列,其中原始元素 value 将是队列中元素的优先级。弹出尽可能多的内容并将其放入列表中。现在,您可以使用基于原始索引的可比较界面对列表进行排序。您的比较函数应根据元素的索引进行比较,并返回较低的值。