Jay*_*ram 9 language-agnostic algorithm
给定一个可能包含重复项的数组,我们如何才能找到它是否是一个序列?
例如. {7, 3, 5, 4, 6, 2}
是一个序列 2, 3, 4, 5, 6, 7
排序是一个明显的解决方案.我们怎样才能在O(n)时间和O(1)空间中做到这一点?
Joh*_*rak 10
假设1,2,3,3,4,1是一个有效的未排序序列,并且2,4,6,8是一个有效序列(第二步),但1,3,5,9不是(7缺失)并假设输入数组可以被覆盖,
a_n - minmax - min > (count + 1) * step),这不是一个序列.除此以外,v_0(v_0 - min) / step + start)时,让它的目标位置i
start,则重复.将其移到后面并减少结束指针end,则序列中缺少某些元素.声明数组不是序列.min引用v_0,则将其交换到数组的末尾并递减结束指针.这是重复的.v_0.就地整数排序是O(n).在每一步中它都是:
在排序结束时,每个元素在重复块中都是重复的,或者在排序块中的正确位置.
注意,可以省略步骤#3.#4将正确地确定这不是一个序列,虽然速度较慢.
如果步骤必须为1,则可以稍微简化该算法(参见修订版#1)
odd*_*ity -1
让我尝试一下:
public bool IsSequence(int[] values)
{
var min = values[0];
var max = values[0];
foreach (var value in values)
{
min = min > value ? value : min;
max = max > value ? max : value;
}
if ((max - min + 1) != values.Length)
return false;
var testingArray = new int?[values.Length];
foreach (var value in values)
{
var index = value - min;
if (testingArray[index].HasValue)
return false;
else
testingArray[index] = value;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)