매일 필기 테스트 -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)。