매일 필기 테스트 -leetCode 26. 정렬 된 배열에서 중복 삭제

매일 필기 테스트 -leetCode 26. 정렬 된 배열에서 중복 삭제

leetCode 26. 정렬 된 배열에서 중복 삭제

정렬 된 배열이 주어지면 반복되는 요소를 제자리에서 삭제하여 각 요소가 한 번만 나타나고 제거 된 배열의 새 길이를 반환해야합니다.

추가 배열 공간을 사용하지 마십시오. 입력 배열을 현장에서 수정하고 O (1) 추가 공간으로 완료해야합니다.

예 1 :

주어진 배열 nums = [1,1,2],

함수는 새 길이 2를 반환해야하며 원래 배열 nums의 처음 두 요소는 1, 2로 수정되었습니다.

새 길이를 초과하는 배열의 요소를 고려할 필요가 없습니다.

예 2 :

주어진 숫자 = [0,0,1,1,1,2,2,3,3,4],

이 함수는 새 길이 5를 반환해야하며 원래 배열 번호의 처음 5 개 요소는 0, 1, 2, 3, 4로 수정되었습니다.

새 길이를 초과하는 배열의 요소를 고려할 필요가 없습니다.

기술:

반환 된 값이 정수이지만 출력 응답이 배열 인 이유는 무엇입니까?

입력 배열은 "참조"에 의해 전달됩니다. 즉, 함수에서 입력 배열을 수정하면 호출자가 볼 수 있습니다.

다음과 같이 내부 작업을 상상할 수 있습니다.

// nums는 "reference"에 의해 전달됩니다. 즉, 실제 매개 변수를 복사하지 마십시오.
int len ​​= removeDuplicates (nums);

// 함수에서 입력 배열을 수정하는 것은 호출자에게 표시됩니다.
// 함수에서 반환 된 길이에 따라 해당 길이 범위 내의 배열에있는 모든 요소를 ​​인쇄합니다.
for (int i = 0; i <len; i ++) { print (nums [i]); }

방법 : 이중 포인터 방법

코드 쇼 :

package cn.lbl.face.leetCode;

/*
给定数组 nums = [1,1,2],

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。

 */
public class 删除排序数组中的重复项2 {
    
    
    public static void main(String[] args) {
    
    
//        System.out.println( removeDuplicates(new int[]{1,1,2}));
        System.out.println( removeDuplicates(new int[]{
    
    0,0,1,1,1,2,2,3,3,4}));
//        System.out.println( removeDuplicates(new int[]{0,0,1,1,1,2,2,3,3,4}));
    }

    //双指针法
    //快慢指针 i(慢)  j(快)
    public static int removeDuplicates(int[] nums) {
    
    
        int i=0;
        for (int j = 1; j <nums.length ; j++) {
    
    
            if (nums[i] != nums[j]) {
    
    
                i++;
                nums[i]=nums[j];
            }
        }
        return i+1;
    }
}

복잡성 분석

时间复杂度:O(n),假设数组的长度是 n,那么 i 和j 分别最多遍历 n 步。

空间复杂度:O(1)。

여기에 사진 설명 삽입

추천

출처blog.csdn.net/qq_37924905/article/details/108718920