查找数组中相等数字的最小索引差的算法

标签 algorithm

有没有人知道如何解决下一个问题:

我们有一个数组,例如让它成为 a = {1, 0, -1, -2, -1, 0, 1, 2, 3, 4, 5, 1}。

算法应该找到的是相同数字的索引之间的最小差异的大小。 在此示例(数组 a)中,1 的索引差异为 6-0=0 和 11-6=5,0 的索引差异为 5-1=4,负 1 的索引的差异为 4-2= 2 等等。 该算法应该返回 2,因为我们可以看到它是相同数字的索引的最小差异。

有没有比 O(n^2) 更好的时间复杂度来解决这个问题的方法?

最佳答案

其他几个答案提出可以在 O(n*logn) 中完成的排序(元素、索引)对。但是,可以在 O(n) 时间内做得更好。不需要对数组进行排序,也不需要保留所有的(元素,索引)对,因为可以贪婪地找到最小值。

遍历数组一次并将每个元素的最后一个索引存储在散列中。

int smallestDifference(int[] a) {
    Map<Integer, Integer> lastIndex = new HashMap<>();
    int minDiff = Integer.MAX_VALUE;
    for (int i = 0; i < a.length; i++) {
        if (lastIndex.contains(a[i])) {
            minDiff = Math.min(minDiff, i - lastIndex.get(a[i]));
        }
        lastIndex.put(a[i], i);
    }
    return minDiff;
}

从散列中插入/获取的时间复杂度为 O(1),因此整个数组的复杂度为 O(n)。

关于查找数组中相等数字的最小索引差的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37150139/

相关文章:

java - 插入排序算法对 String[] 进行排序

有向加权边图及其权重的算法

r - 带ddply函数的频率表

algorithm - Big-Theta(n^m) 递归

algorithm - O 符号和一些数学

algorithm - 位掩码动态规划中的重叠子问题

c# - 真值表作为字典的键

python - 如何在Python中的类中而不是类之外声明函数

arrays - char数组中数字的最小值

algorithm - 什么是可用于有效查找对象是否与一组模式中的任何一个匹配的算法/结构?