[Leetcode] 26. Remove Duplicates from Sorted Array
Algorithm2021. 7. 25. 17:21
반응형
Identifying the Problem
주어진 수열 내에 존재하는 중복 요소들을 제거하고, 수열의 길이를 리턴한다.
제한 조건은 다음과 같다.
- 0 <= 수열의 길이 <= 3 * 10^4
- -100 <= 개별요소 값 <= 100
- 주어진 수열은 오름차순이다.
- 시간복잡도 O(1)이고, 다른 수열을 생성해선 안된다.
Organizing thoughts
Main idea는 중복된 수가 있을 때 마다 pass하고,
비교하는 두 수가 서로 다를 때, 더 큰 수를 앞에 보내면 된다.
즉, 다음 수를 누적중복된 만큼 앞으로 보내면 된다. (아래에서 누적중복은 pass의 개수이다.)
다음과 같이 이해하면 쉬울 것 같다.
nums | 1 | 1 | 1 | 3 | 4 | 5 |
index | 0 | pass | pass | 3->1 | 4->2 | 5->3 |
1. numSize 가 0,1 인 경우는 중복이 불가능하다.
2. 앞과 뒤를 비교하려면 size - 1 까지 해야한다.
3. 같을 경우 누적중복을 증가시키고,
4. 다를 경우 다음 수를 누적중복 앞만큼 보낸다.
Sourcecode
int removeDuplicates(int* nums, int numsSize){
int count = 1;
int flag = 0;
if(numsSize <2) return numsSize; //1
for(int i =0;i<numsSize-1;i++) //2
{
if(nums[i] == nums[i+1]) //3
flag ++;
else
{
nums[i-flag+1] = nums[i+1]; //4
count++;
}
}
return count;
}
Mistake
처음에 중첩 반복문으로 작성했다가, 시간복잡도에서 벗어나서 컽 당했다.
도저히 모르겠어 로직을 참고했다.
New things learned
누적 중복 말고, 반복문 i 와 다른 속도로 가는 새로운 index 를 적용시키면 더 직관적일 것 같다.
반응형
'Algorithm' 카테고리의 다른 글
[Leetcode] 28. Implement strStr() (0) | 2021.07.25 |
---|---|
[Leetcode] 27. Remove Element (0) | 2021.07.25 |
[Leetcode] 21. Merge Two Sorted Lists (0) | 2021.07.24 |
[Leetcode] 14. Longest Common Prefix (0) | 2021.07.24 |
[Leetcode] 13. Roman to Integer (1) | 2021.07.20 |
댓글()