Javascript 查找序列中重复项的更好方法,而不是检查其第一个和最后一个索引

Javascript 查找序列中重复项的更好方法,而不是检查其第一个和最后一个索引,javascript,arrays,algorithm,time-complexity,Javascript,Arrays,Algorithm,Time Complexity,我正在求解一个从1到N的整数序列,任务是找到序列中缺少的整数,以及一个重复的整数 制约因素- 不允许对数组进行排序 对于较大的N值,您的解决方案不应超时 理想情况下,您的解决方案不应该使用额外的空间,输入数组提供的空间除外(可以修改) 我当前的代码超时了,我假设这是因为查找重复元素的复杂性可能是O(N^2) 对于缺少的元素,我的算法是- 创建一个变量,将其设置为1,并循环直到条件为真 在循环中,检查数组中是否存在变量,若存在,则递增变量并继续循环 如果在数组中找不到变量,则这是缺少的元素。打破循

我正在求解一个从
1到N的整数序列,任务是找到序列中缺少的整数,以及一个重复的整数

制约因素-

不允许对数组进行排序

对于较大的N值,您的解决方案不应超时

理想情况下,您的解决方案不应该使用额外的空间,输入数组提供的空间除外(可以修改)

我当前的代码超时了,我假设这是因为查找重复元素的复杂性可能是
O(N^2)

对于缺少的元素,我的算法是-

  • 创建一个变量,将其设置为1,并循环直到条件为真
  • 在循环中,检查数组中是否存在变量,若存在,则递增变量并继续循环
  • 如果在数组中找不到变量,则这是缺少的元素。打破循环
  • 这应该在
    O(N)
    时间内运行,所以这部分应该可以

    对于重复元素,我的方法是检查数组中每个元素的第一个索引和最后一个索引。对于唯一的元素,索引值是相同的,但是对于重复的元素,索引值是不同的

    我想这就是问题所在

    我的代码-

    函数解决方案(数组){
    var缺失=0,
    重复=0;
    let notFound=true;
    设curr=1;
    while(未找到){
    if(数组索引of(curr)=-1){
    notFound=false;
    打破
    }
    curr++;
    }
    缺失=当前;
    重复=数组。查找((e,i,arr)=>arr.indexOf(e)!==arr.lastIndexOf(e));
    返回[丢失,重复];
    }
    
    log(解决方案([2,3,1,4,4,6])我想你可以散列你的输入数组。
    我的意思是,假设你的数组是[4,1,5,6,3,1]
    下面是一个简单的伪代码。
    您可以获得如下重复元素:

    for i:array.length
        array[array[i]] = array[i]*-1 // you found and marked first element of your array
        if(array[i] > 0) //it would be positive if you found and marked an element twice.
            array[array[i]] is the duplicate element
    
    这在O(n)中运行

    现在要获取缺少的元素,可以再次遍历数组

    for i:array.length
        if (array[i] > 0 && array[i]!=duplicate element) //there would be two positive numbers, missing number and the duplicate
            i = missing element
    
    这个O(n),所以它是O(n)。
    如果有什么不清楚的地方,你可以问。很抱歉,我更喜欢编写伪代码而不是解释。

    一个类似的问题:我想知道为什么我的问题被否决了。它不是含糊不清的,不是固执己见的,也不是非常广泛的,不是不清楚的,也不是没有研究努力的家庭作业。