정렬된 배열 II에서 중복 제거

2180 단어 theabbieleetcodedsa
감소하지 않는 순서로 정렬된 정수 배열nums이 있는 경우 각 고유 요소가 최대 두 번 나타나도록 일부 중복 항목in-place을 제거합니다. 요소의 상대적인 순서는 동일하게 유지되어야 합니다.

일부 언어에서는 배열의 길이를 변경할 수 없으므로 결과를 배열의 첫 번째 부분에 배치해야 합니다nums. 더 공식적으로, 중복을 제거한 후 k 요소가 있는 경우 k의 첫 번째nums 요소가 최종 결과를 보유해야 합니다. 첫 번째 k 요소 외에 무엇을 남겨도 상관 없습니다.

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

다른 어레이에 추가 공간을 할당하지 마십시오. O(1) 추가 메모리로 입력 배열in-place을 수정하여 이를 수행해야 합니다.

커스텀 심사위원:

심사위원은 다음 코드를 사용하여 솔루션을 테스트합니다.

int[] 숫자 = [...];//입력 배열
int[] expectedNums = [...];//올바른 길이의 예상 답변

int k = removeDuplicates(숫자);//구현을 호출합니다.

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

모든 어설션이 통과되면 솔루션이 수락됩니다.

예 1:

입력: 숫자 = [1,1,1,2,2,3]
출력: 5, 숫자 = [1,1,2,2,3,_]
설명: 함수는 nums의 처음 5개 요소가 각각 1, 1, 2, 2, 3인 k = 5를 반환해야 합니다.
반환된 k 뒤에 무엇을 남기는지는 중요하지 않습니다(따라서 밑줄입니다).

예 2:

입력: 숫자 = [0,0,1,1,1,1,2,3,3]
출력: 7, 숫자 = [0,0,1,1,2,3,3,_,_]
설명: 함수는 nums의 처음 7개 요소가 각각 0, 0, 1, 1, 2, 3, 3인 k = 7을 반환해야 합니다.
반환된 k 뒤에 무엇을 남기는지는 중요하지 않습니다(따라서 밑줄입니다).

제약:
  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums가 내림차순으로 정렬됩니다.

  • 해결책:

    class Solution:
        def removeDuplicates(self, nums: List[int]) -> int:
            n = len(nums)
            i = 0
            while i < n:
                ctr = 1
                while i < n - 1 and nums[i] == nums[i + 1]:
                    ctr += 1
                    if ctr > 2:
                        nums[i] = None
                    i += 1
                i += 1
            i = 0
            while i < len(nums):
                if nums[i] == None:
                    nums.pop(i)
                else:
                    i += 1
            return len(nums)
    

    좋은 웹페이지 즐겨찾기