当前位置: 首页 > 面试题库 >

从小于O(n)的排序数组中查找唯一数字

羊舌富
2023-03-14
问题内容

我接受了采访,并且有以下问题:

在不到O(n)的时间内从排序数组中查找唯一数字。

Ex: 1 1 1 5 5 5 9 10 10
Output: 1 5 9 10

我给出了解决方案,但这是O(n)的。

编辑: 排序后的数组大小约为200亿,唯一数约为1000。


问题答案:

分而治之

  • 查看排序序列的第一个和最后一个元素(初始序列为data[0]..data[data.length-1])。
  • 如果两者相等,则序列中的唯一元素是第一个(无论序列有多长)。
  • 如果不同,则划分序列并为每个子序列重复。

一般情况下解决 O(log(n)) ,仅在最坏情况下解决O(n)(当每个元素不同时)。

Java代码:

public static List<Integer> findUniqueNumbers(int[] data) {
    List<Integer> result = new LinkedList<Integer>();
    findUniqueNumbers(data, 0, data.length - 1, result, false);
    return result;
}

private static void findUniqueNumbers(int[] data, int i1, int i2, List<Integer> result, boolean skipFirst) {

    int a = data[i1];
    int b = data[i2];

    // homogenous sequence a...a
    if (a == b) {
        if (!skipFirst) {
            result.add(a);
        }
    }
    else {
        //divide & conquer
        int i3 = (i1 + i2) / 2;
        findUniqueNumbers(data, i1, i3, result, skipFirst);
        findUniqueNumbers(data, i3 + 1, i2, result, data[i3] == data[i3 + 1]);
    }
}


 类似资料:
  • 我在Java编码,我需要一个排序的整数数据结构,它有最大的O(log(n))插入时间和O(1)按索引查找。是否有一个内置的数据结构可以做到这一点,或者如果没有,我如何自己编程一个? 我知道集合可以完成第一个任务,但要查找元素I,我需要在元素I之前遍历所有元素。

  • 问题内容: 如果我有一个PHP数组: 带有值: 我有一个变量: 如何返回值?: 因为那是数组中最接近38(递增)的值? 问候, 泰勒 问题答案:

  • 对cs来说很新鲜...在一次演讲的结尾,我的AP计算机科学老师提到在排序数组中找到指定值的比较模型是“大欧米茄(log n)”,我的理解是,这意味着完成这个任务的速度不可能比O(log n)快?你能帮我弄明白为什么吗?谢谢你!

  • 求一个未排序数组的中值,我们可以对n个元素做O(nlogn)时间的min-heap,然后我们可以逐个抽取n/2个元素得到中值。但是这种方法需要O(nlogn)时间。 我们能在O(n)时间内通过某种方法做同样的事情吗?如果可以,那么请告诉或建议一些方法。

  • 我试图写一个算法,它需要可变数量的通用数组,存储在中,并收集其中所有唯一的元素(元素只发生一次),并将其存储在一个数组中,称为。例如,数组: 将生成包含内容的数组。 以下是我当前的流程算法: 请注意,是一个数组,它包含