μ²μ λ΄€μλ sorting μ΄λ setμ μ°λ©΄ λκ² μ§ νμ§λ§β¦ arrayλ₯Ό μμ ν μ μκ³ , constant storage complexity O(1)
, linear time complexity O(n)
μ μ½ μ‘°κ±΄μ΄ μμ΄μ μ¬μ©ν μ μμ΄μ μ΄λ €μ λ λ¬Έμ μ΄λ€. Floyd's Tortoise and Hare μκ³ λ¦¬μ¦μ μ¬μ©ν΄μΌ νλ€. Linked listμμ cycleμ΄ μ‘΄μ¬ν λ cycleμ μμμ μ μ°Ύμ μ μλ μκ³ λ¦¬μ¦μ΄λ€. κ·Έλνμ λͺ¨μμ νμ (cycle) λμ μ (index 0
μμμ )μ΄ λΆμ΄μλ λͺ¨μμ΄ λλ€. λ¬Έμ λ cycleμ μμμ μ΄ μ΄μ§Έμ μ€λ³΅λ κ°μΌ μ μλκ° νλ μ μ΄λ€. μ΄λ arrayμ μ€λ³΅λ κ°μ΄ μμ κ²½μ° κ·Έλνμμ μ€λ³΅λ κ°μ λν λ
Έλλ§μ΄ μ μΌνκ² λ€μ΄μ€λ μ°κ²°μ΄ 2κ° μ΄μμ΄κΈ° λλ¬Έ μ΄λ€. λλ¨Έμ§ κ°μ ν΄λΉνλ λ
Έλ λ λ€μ΄μ€λ μ°κ²°μ΄ νλ μ΄λ―λ‘ index 0
μμμ β cycleμ μμμ λλ cycle λ΄λΆμ μμΉ νκ² λλ€.λ¬Όλ‘ μΌλΆ λ
Έλλ index 0
μμμ μ μμ λΏλ cycleμ νμ±νλλ°μμ μ μΈλ μ μλ€. μλ κ·Έλ¦Όμ μ΄ν΄λ₯Ό λκΈ° μν΄μ index 0
μ ν¬ν¨μμΌ°μ§λ§ μκ³ λ¦¬μ¦μμλ index 0
μ΄ κ°λ¦¬ν€λ μ§μ λΆν° μμνλ€. λ¬Όλ‘ index 0μΌλ‘ μμν΄λ κ²°κ³Όλ κ°λ€. μκ³ λ¦¬μ¦μ΄ λμνλ μ리λ λ€μκ³Ό κ°λ€. 쑰건
index 0
μμμ β cycleμ μμμ κΉμ§μ κΈΈμ΄λ₯Ό m
, cycleμ κΈΈμ΄λ₯Ό n
μ΄λΌκ³ νμ.
λμ΄ λ§λκΈ°κΉμ§ κ±°λΆμ΄κ° λ λ°ν΄ μλ₯Ό a
, ν λΌκ° λ λ°ν΄ μλ₯Ό b
λΌκ³ νμ.
cycleμ μμμ λΆν° ν λΌμ κ±°λΆμ΄κ° cycleμμ λ§λ μ§μ κΉμ§μ 거리λ₯Ό k
λΌκ³ νμ.
νμ΄
첫λ²μ§Έ λ¨κ³μμ λμ΄ λ§λκΈ°κΉμ§ κ±°λΆμ΄κ° μ΄λν 거리λ m + a * n + k
, ν λΌκ° μ΄λν 거리λ m + b * n + k
κ° λλ€.
ν λΌκ° μ΄λν 거리λ κ±°λΆμ΄κ° μ΄λν 거리μ 2λ°°κ° λλ―λ‘ 2 * (m + a * n + k) = m + b * n + k
κ° λλ€.
μ 리νλ©΄ m = (b - 2a) * n - k
κ° λλ€.
βββ
μ΄μ λλ²μ§Έ λ¨κ³μμλ κ±°λΆμ΄λ κ·Έλνμ μμ μμΉ(index 0
)λ‘ μ΄λν μνμμ, ν λΌλ λμ΄ λ§λ μμΉ (cycleμ μμμ κΈ°μ€μΌλ‘ k
) μμ λλ€ νμΉΈμ© μμ§μ΄κ² λλ€.
κ±°λΆμ΄κ° κ·Έλνμ μμ μμΉμμ m λ§νΌ μ΄λνλ©΄ cycleμ μμμ 0
μ λλ¬νλ€.
ννΈ ν λΌλ cycleμ μμμ μ κΈ°μ€μΌλ‘ (k + m) % n
μμΉμ λλ¬νλ€.
(k + m) % n = (k + (b - 2a) * n - k) % n = ((b - 2a) * n) % n = 0
μ¦, ν λΌλ cycleμ μμμ μ λλ¬νκ² λλ€.
μκ° λ³΅μ‘λλ O(n)
μΈλ° μ΄λ νμ΄μμ 보μ΄λ―μ΄ λμ μ΄λ 거리 (array μ‘°ν μ°μ°μ μ)κ° nμ λΉλ‘νκΈ° λλ¬Έμ΄λ€. class Solution {
public:
int findDuplicate(vector<int>& nums) {
int start = nums[0];
int t = nums[start];
int h = nums[t];
while (t != h) {
t = nums[t];
h = nums[nums[h]];
}
t = start;
while (t != h) {
t = nums[t];
h = nums[h];
}
return t;
}
};