給定一個可能包含重複數組的數組,我們如何才能找到它是否是一個序列?查找一個數組是否是O(n)時間和O(1)空間的序列
例如, {7, 3, 5, 4, 6, 2}
是序列2, 3, 4, 5, 6, 7
排序是一個明顯的解決方案。我們如何在O(n)時間和O(1)空間中做到這一點?
給定一個可能包含重複數組的數組,我們如何才能找到它是否是一個序列?查找一個數組是否是O(n)時間和O(1)空間的序列
例如, {7, 3, 5, 4, 6, 2}
是序列2, 3, 4, 5, 6, 7
排序是一個明顯的解決方案。我們如何在O(n)時間和O(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;
}
假設1,2,3,3,4,1
是一個有效的未排序的序列和2,4,6,8
是一個有效的序列(步驟2),以及,但1,3,5,9
不是(7丟失),並假設輸入數組可以被覆蓋,
max - 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)
哦,我注意到我剛剛發佈的答案似乎是對此的實現;) –
這實際上是我發佈的解決方案的一般化。因此,我刪除了我的帖子。優秀的答案。 –
讓我感覺自己像一個完全白癡的一切都非常棒! –
該算法(Python)的破壞原始陣列,但在其他方面滿足O(n)的時間和O( 1)額外的空間。
# INPUT: An array 'arr' of N integers.
# OUTPUT: If the array consists exactly of the integers
# S, S+1, ..., S+N-1, for some S, in any order,
# then modifies 'arr' into a sorted array and returns it.
# Otherwise, returns False, and 'arr' may have been modified.
def sort_sequence (arr):
the_min = min(arr)
the_max = max(arr)
if the_max - the_min != len(arr) - 1:
return False
for i in range(len(arr)):
arr[i] -= the_min
for i in range(len(arr)):
while arr[i] != i:
j = arr[i]
t = arr[j]
if t == j:
return False
arr[j] = j
arr[i] = t
for i in range(len(arr)):
arr[i] += the_min
return arr
我還沒有正式證明它的工作原理。
爲什麼這是O(n)?在最後一個雙重循環中,一個元素首次放入正確的位置後,只能再次訪問它 - 無論是在另一個內部循環的開始,它看起來是在正確的位置,還是在它的位置妨礙重複元素(if t == h
部分)。
這看起來類似於[mine](http://stackoverflow.com/a/18102484/499214),除非您假定步驟爲1並且您不允許重複。後者明顯違反規範。 –
@JanDvorak好吧,這個問題是不明確的,它只是說該數組可能包含重複項,而不是它們如何被解釋。無論如何,我在評論中說明了我的算法應該解決哪個問題。 –
@JanDvorak同樣的問題沒有說任何關於步長的問題。我認爲,如果意圖是允許任何步長,那麼它就會按照算術級數進行編寫。 –
步驟2使用空間O(n)。 – jbr
這是你的意思嗎? http://stackoverflow.com/a/18102484/499214步驟#2聽起來像你試圖通過分配無限的額外內存超出'O(1)'空間。 –
好的,錯過了空間需求 – oddparity