순서를 그대로 유지하며 저장되는 개수를 저장해야하므로, 지금 포인터가 요소를 저장할 수 있는 개수를 초기화하며 풀 수 있지 않을까요?
별도의 자료구조를 더 정의하는 것은 메모리를 추가로 더 사용하므로 지양하였습니다.
수도코드
class Solution {
public int removeDuplicates(int[] nums) {
int curl = 1;
int stored = 2;
for (int p=1; p<nums.length; p++) {
nums[curl++] = nums[p];
if (nums[p-1] == nums[p]) {
stored --;
}
if (nums[p-1] != nums[p]) {
stored = 2;
}
if (stored == 0) curl --; // 저장가능한 개수가 0이되면 포인터를 뒤로 옮겨서 다음 숫자가 덮어 쓸 수 있도록 한다.
}
return curl;
}
}
class Solution {
public int removeDuplicates(int[] nums) {
int curl = 1; // 두번째 요소부터 입력한다.
int ability = 2;
for (int p=1; p<nums.length; p++) {
nums[curl] = nums[p]; // 먼저 입력한다.
if (nums[curl-1] == nums[p]) { // 이전 입력값과 같으면 저장가능한 숫자를 줄인다.
ability --;
}
if (nums[curl-1] != nums[p]) { // 만약 다르다면 저장 가능한 숫자를 초기화한다.
ability = 2;
}
if (ability > 0) curl ++; // 만약 더 저장할 수 있다면 입력 포인터를 늘려 다음 자리를 채운다.
}
return curl;
}
}
결과 2차
다른 풀이 방식과 문제 회고
class Solution {
public int removeDuplicates(int[] nums) {
if(nums <= 2){
return nums.length;
}
int index = 2;
for(int i = 2; i < nums.length; i++){
if(nums[i] != nums[index - 2]){
nums[index++] = nums[i];
}
}
return index;
}
}
이번에는 공간복잡도는 좋은 편이었으나, 시간 복잡도가 다른 사람의 풀이에 대해 많이 떨어졌다.
nums 길이가 짧을 때 처리와 포인터 방식이 아닌 바로 2개 전 변수와 함께 비교하는 방식으로 코드를 더 단순하게 짤 수 있었다. nums가 이미 정렬되어 있으므로 가능한 방법이었다.