Search
Duplicate
📒

[LeetCode Top 150] 01-4. Remove Duplicate from Sorted Array 2- Medium

상태
완료
수업
Algorithm Solving
주제
LeetCode Top Interview 150
4 more properties
참고

문제해설

NOTE
입력 ⇒ 비내림차순 정수 배열이 제공된다.
출력 ⇒ 정수배열 길이 - 고유 요소가 최대 3번이상 나오는 경우

문제 로직고민

NOTE
2번을 넘어선 반복요소를 어떻게 찾는가?
int idx = 2; int k = 0; for(int i = 2; i < 배열 길이; i++) { if(배열[i] <= 배열[i-2] k++; else 배열[idx++] = 배열[i]; }
Java
복사
처음 생각한 로직
이전 문제를 응용해 이번 문제에서는 n의 요소가 n-2보다 커야 중복되지 않는다고 판단했다.
당연히 될줄알았는데 예상하지 못한 케이스가 있었다. 특정경우에 비교되어야 하는 값이 바뀐다는 점이다.
2번째 2에서 원래라면 1을 비교해 배열에 기록하지만, 1번째 2에서 2로 변경되어 생략되어버림
코드 수정
int idx = 2; for(int i = 2; i < 배열 길이; i++) { if(배열[i] != 배열[idx-2]) { 배열[idx++] = 배열[i] } }
Java
복사
배열이 변경되는것에 영향을 받지 않도록 코드를 수정했다.
다음과 같이 작성하면 idx의 위치기반으로만 보기때문에 문제없이 돌아간다.

작성코드

NOTE
class Solution { public int removeDuplicates(int[] nums) { int idx = 2; for(int i = 2; i < nums.length; i++){ if(nums[i] != nums[idx-2]){ nums[idx++] = nums[i]; } } return idx; } }
Java
복사

정답코드

NOTE
class Solution { public int removeDuplicates(int[] nums) { int index = 0; int numberOfDuplicate = 1; for ( int num : nums){ if (index <= 1 || nums[index-2]!=num){ nums[index++] = num ; } } System.gc(); return index; } }
Java
복사
메모리를 가장 적게 사용하는 코드
이번에도 메모리가 2MB정도 밖에 차이안나서 크게 개선할점은 보이지 않는다.
System.gc();가 메모리와 관련되있는건가? 가비지컬렉션을 실행시키는 이유는 잘모르겠다.