본문 바로가기
Algorithm/LeetCode

LeetCode - Remove Duplicates from Sorted Array

by HaningYa 2020. 9. 11.
728x90


문제

Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.

Example 1:

Given nums = [1,1,2], Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. It doesn't matter what you leave beyond the returned length.

Example 2:

Given nums = [0,0,1,1,1,2,2,3,3,4], Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively. It doesn't matter what values are set beyond the returned length.

Clarification:

Confused why the returned value is an integer but your answer is an array?

Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well.

Internally you can think of this:

// nums is passed in by reference. (i.e., without making a copy)
int len = removeDuplicates(nums);

// any modification to nums in your function would be known by the caller.
// using the length returned by your function, it prints the first len elements.
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

처음풀이

while 로 돌면서 하나 찾으면 다시 또 돌고 

비효율 적이다.

class Solution {
    func removeDuplicates(_ nums: inout [Int]) -> Int {
        
        if nums.count == 0 {
            return 0
        }
        while true {
            var isDuplicated = false

            for i in 0..<nums.count-1 {
                if nums[i] == nums[i+1] {
                    nums.remove(at: i)
                    isDuplicated = true
                    break
                }
            }   
            if isDuplicated == false{
                break
            }
        }

        return nums.count
    }
}

매끈한 풀이

2pointer

class Solution {
    func removeDuplicates(_ nums: inout [Int]) -> Int {
        
        if nums.count == 0 {
            return 0
        }
        //0에서 시작한다.
        var i = 0
        for j in 1..<nums.count {
            //같은걸 계속 만나다가 다른걸 만나면                   112223
            if nums[j] != nums[i] {
                //i를 1만큼 증가시키고 거기에 다른걸 집어넣는다.   121223
                i += 1
                nums[i] = nums[j]
            }
            print(nums)
        }
        print(nums)
        //반복하면 112223 121223 12322
        //123만큼의 길이를 리턴하면 된다.
        //12322 일경우 i는 2번 증가됬기 때문에 len 은 i+1까지이다.

        return i+1
    }
}

728x90

'Algorithm > LeetCode' 카테고리의 다른 글

이진탐색  (0) 2021.01.19
Traversing Tree (recursive, iterative)  (0) 2021.01.18
LeetCode - Fibonacci Number, Climbing Stairs  (0) 2020.09.10
LeetCode - Pascal's Triangle II  (0) 2020.09.10
LeetCode - Search in Binary Search Tree  (0) 2020.09.10

댓글