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)。
如果有什么不清楚的地方,你可以问。很抱歉,我更喜欢编写伪代码而不是解释。一个类似的问题:我想知道为什么我的问题被否决了。它不是含糊不清的,不是固执己见的,也不是非常广泛的,不是不清楚的,也不是没有研究努力的家庭作业。