sliding window of size 3๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
window์ 2๊ฐ๊น์ง์ ๊ฐ์ ์ซ์๊ฐ ๋ค์ด์ฌ๋ slow pointer๊ณผ fast pointer ๋ ๋ค ์์ง์ธ๋ค. ํ์ง๋ง 3๊ฐ์งธ์์๋ fast pointer๋ง ์์ง์ฌ non-duplicate number๋ฅผ ์ฐพ๋๋ค.
[a, a, b]์ sliding window์ c๋ฅผ ๊ฐ๋ฆฌํค๋ fast pointer๋ ๊ฐ๋ฅํ ๊น?
๋ง์ฝ ๊ฐ๋ฅํ๋ค๋ฉด c๋ b๋ฅผ overwriteํด non-duplicate์ธ element๋ฅผ ์์ ๋ ๊ฒ์ด๋ค.
3๊ฐ์ง ๊ฒฝ์ฐ์ ์๊ฐ ์๋ค.
1. ์ฒ์ ์์ํ ๋๋ถํฐ [a, a, b] ์ fastPointer = c๋ก ์์ํ๋ค.
๋ถ๊ฐ๋ฅํ๋ค. ์๋ํ๋ฉด ์ฒ์ ์์ํ ๋ fastPointer == slowPointer์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๊ฒฝ์ฐ fast pointer๋ b์ duplicate check๋ฅผ ํ์ง ์์์ฑ c๋ก ์คํตํ ๊ฒ์ด ๋๋ค. b < c ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ ์ํ์ window๋
[?, a, a] ์ fastPointer = b <= ์ฌ์ผ ํ๋ค. ํ์ง๋ง a < b์ด๊ธฐ ๋๋ฌธ์ ? ๋ ๋ฌด์กฐ๊ฑด <= a < b์ด๋ค. ๊ทธ ๋ป์ window[2]์ b๊ฐ overwrite ๋์ด์ผํ๋ค๋ ๋ป์ด์ง๋ง ๊ทธ๋ ์ง ์์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด ๊ฒฝ์ฐ๋ ๋ถ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ด ์ํ์ window์ ๋ค๋ค๋ฅผ ์ ์๋ค.
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length < 3) {
return nums.length;
}
int slowPointer = 2;
for (int fastPointer = 2; fastPointer < nums.length; fastPointer++) {
if (nums[fastPointer] != nums[slowPointer - 2]) {
nums[slowPointer] = nums[fastPointer];
slowPointer++;
}
}
return slowPointer;
}
}