[LeetCode] 80. Remove Duplicates from Sorted Array II - Java[자바]

doxxx·2023년 8월 22일
0

LeetCode

목록 보기
4/25
post-thumbnail

링크

문제

정수 배열의 숫자가 감소하지 않는 순서로 정렬되어 있을 때, 각 고유 요소가 최대 두 번만 나타나도록 중복된 부분을 제자리에서 제거합니다. 요소의 상대적 순서는 동일하게 유지해야 합니다.

일부 언어에서는 배열의 길이를 변경할 수 없으므로 대신 배열 번호의 첫 번째 부분에 결과를 배치해야 합니다. 좀 더 공식적으로 말하자면, 중복을 제거한 후 요소가 k 개 있는 경우 nums의 처음 k 개 요소가 최종 결과를 보유해야 합니다. 첫 번째 k 요소 너머에 무엇이 남는지는 중요하지 않습니다.

nums의 처음 k 슬롯에 최종 결과를 배치한 후 k를 반환합니다.

다른 배열을 위해 추가 공간을 할당하지 마십시오. O(1)의 추가 메모리로 입력 배열을 제자리에서 수정하여 이 작업을 수행해야 합니다.

int[] nums = [...]; // Input array
int[] expectedNums = [...]; // The expected answer with correct length

int k = removeDuplicates(nums); // Calls your implementation

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

위의 검증이 모두 통과되어야 합니다.

풀이

class Solution {  
    public int removeDuplicates(int[] nums) {  
        int i = 0;  
        for (int n : nums) {  
            if (i < 2 || n > nums[i - 2]) {  
                nums[i++] = n;  
            }  
        }  
        return i;  
    }  
}

for-each 문에서 index가 있는 for 문으로 바꾼 코드는 다음과 같다.
아마 index가 있는 for문이 이해하기에는 더 적합할 수도 있기에 같이 적는다.

class Solution {  
    public int removeDuplicates(int[] nums) {  
        int i = 0;  
        for (int j = 0; j < nums.length; j++) {  
            int n = nums[j];  
            if (i < 2 || n > nums[i - 2]) {  
                nums[i++] = n;  
            }  
        }  
        return i;  
    }  
}

지난번 문제와는 다르게 추가 배열이나 리스트를 생성할 수 없게 되었다.

또한 최대 2번 중복값이 존재할 수 있다는 조건으로 바뀌었다.

코드의 n이 두 개 이전의 숫자 보다 크다면(== 중복되지 않은 새로운 값) nums[i]에 n을 덮어 씌우게 됩니다.

0개의 댓글