정렬 된 배열을 지정해, 각 요소가 제거 된 배열의 새 길이를 반환 한 후, 한 번만 나타나도록, 장소에 반복되는 요소를 제거해야합니다.
배열을위한 여분의 공간을 사용하지 마십시오, 당신은 장소에 입력 배열을 수정하고 사용 O (1) 여분의 공간의 조건을 완료해야합니다.
예 1 :
지정된 Array의 nums = [1,1,2]
기능 (2)의 새로운 길이를 반환해야하고 원래 배열의 첫 번째 두 요소 nums 1, 2로 변경된다.
당신은 뒤에 새로운 배열 길이의 요소를 넘어 고려해야 할 필요가 없습니다.
예 2 :
주어 nums = 0,0,1,1,1,2,2,3,3,4,
새로운 기능은 길이 (5)를 반환한다 원래 배열 nums 처음 5 개 요소는 0, 1, 2, 3, 4로 변경된다.
당신은 뒤에 새로운 배열 길이의 요소를 넘어 고려해야 할 필요가 없습니다.
출처 : 유지 버튼 (LeetCode)
링크 : https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
분석 : 공간의 복잡성해야합니다 O (1)
배열을 정렬 된, 이중 포인터 전제를 사용할 수있다
두 포인터 P1과 P2, 원래 배열의 처음 시작점
우리는 P1 지점 이후의 배열의 마지막 요소가 중복되는 번호를 제거 할 수 있다고 가정
현재 P1의 ==의 P2 다음 P1의 경우 ++
현재 P1은 만약! = P2는, 그 위치 (P1)의 전류 값과 점 P2가 배치되어 ++ P1
핵심 아이디어 :
두 포인터는 P1, 다른 요소 (P1)에 만 다음 경우에만 두 개의 서로 다른 포인터 요소 때 오른쪽으로 이동하고 있습니다 ++
원래 디지털 공간의 이러한 사용하다 현재 위치에서 알고리즘
시간 복잡도 : O (N)
공간 복잡도 : O (1)
클래스 해결 { 공개 : INT의 removeDuplicates (벡터 < INT > & V) { INT N = v.size (); 경우 (N 개의 == 0 ) 복귀 0 ; INT의 K = 0 ; 위한 ( int로 I = 1 ; i가 N <; 내가 ++ ) { 경우 (V [I]! = V [K]) { K ++ ; V [K]가 = 브이 [를 I]; } } 리턴 K + 1; } };
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-element
分析:和第一题思路一模一样,只是移动的条件由两个元素是否相等边除了元素是否等于特定元素
时间复杂度:O(N)
空间复杂度:O(1)
class Solution { public: int removeElement(vector<int>& v, int x) { int n=v.size(); if(n==0) return 0; int i=0; for(int j=0;j<n;j++) { if(v[j]!=x) { v[i++]=v[j]; } } return i; } };