https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/
{1, 1, 1, 2, 3, 3, 3, 3}
이 있다면 결과는 {1, 1, 2, 3, 3}
이 됩니다.alreadyDuplicated = false
로 설정되어 있기 때문에 중복을 허용합니다. 그리고 두 가지 과정을 수행합니다.alreadyDuplicated = true
로 변경합니다.alreadyDuplicated = true
입니다. 이때부터는 중복을 허용하지 않기 때문에 탐색 Index만 +1로 이동합니다.alreadyDuplicated = false
로 변경.beforeValue
최신화.위의 과정들을 탐색 Index가 nums의 끝까지 도달할 때 까지 반복합니다.
class Solution {
public int removeDuplicates(int[] nums) {
boolean alreadyDuplicated = false;
int beforeValue = -1;
int inputIndex = 0;
for (int searchIndex = 0; searchIndex < nums.length; searchIndex++) {
if (!isDuplicated(beforeValue, nums[searchIndex])) {
alreadyDuplicated = false;
beforeValue = nums[searchIndex];
nums[inputIndex++] = beforeValue;
continue;
}
// 중복인 경우
if (!alreadyDuplicated) {
alreadyDuplicated = true;
nums[inputIndex++] = beforeValue;
}
}
return inputIndex;
}
private boolean isDuplicated(int beforeValue, int nums) {
return nums == beforeValue;
}
}
index = 1
까지는 고려할 필요가 없다.현재 문제에서는 1회 중복을 허용합니다. 그렇다는 말은 index - 2
와 중복만 아니면 조건을 만족할 수 있다는 것이죠. 결국 중복 플래그가 필요하지 않다는 것이죠.
class Solution {
public int removeDuplicates(int[] nums) {
int length = nums.length;
if (length <= 2) {
return length;
}
int inputIndex = 2;
for (int searchIndex = 2; searchIndex < length; searchIndex++) {
if (nums[searchIndex] != nums[searchIndex - 2]) {
nums[inputIndex] = nums[searchIndex];
inputIndex++;
}
}
return inputIndex;
}
}