给定一个已排序的数组,使用就地算法将重复的数字移除,使数组中的每个元素只出现一次,返回新数组的长度。
不能为数组分配额外的空间,你必须使用常数级空间复杂度的就地算法。
例如,给定输入数组 A=[1,1,2],
你给出的函数应该返回length=2,A数组现在是[1,2]。
class Solution { public: int removeDuplicates(int A[], int n) { if(n<=0) return 0; set<int> s; vector<int> vec; for(int i=0;i<n;i++) { if(s.insert(A[i]).second) vec.push_back(A[i]); } int size = s.size(); for(int i=0;i<size;i++) { A[i]=vec[i]; } return size; } };
/**
* 26.Remove Duplicates from Sorted Array
* 删除排序数组中的重复项
* 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
* 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
* 示例 1:
* 给定数组 nums = [1,1,2],
* 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
* 你不需要考虑数组中超出新长度后面的元素。
* 示例 2:
* 给定 nums = [0,0,1,1,1,2,2,3,3,4],
* 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
* 你不需要考虑数组中超出新长度后面的元素。
*/
public class Solution {
public int removeDuplicates(int[] nums) {
if (nums == null || nums.length == 0){
return 0;
}
int index = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[index] != nums[i]){
nums[++index] = nums[i];
}
}
return index + 1;
}
public static void main(String[] args){
int[] nums = {0,0,1,1,1,2,2,3,3,4};
Solution s = new Solution();
int length = s.removeDuplicates(nums);
System.out.println(length);
}
}
class Solution { public: int removeDuplicates(int A[], int n) { // boundary case if (!n) return 0; int k = 0; for (int i = 1; i < n; ++i) if (A[i] != A[i - 1]) A[++k] = A[i]; return k + 1; } };
//方法一: int removeDuplicates(int A[], int n) { int step = 0; for (int i = 0; i < n;++i){ if (i== n-1 || A[i]!= A[i+1]){ swap(A[i], A[i-step]); } else{ step++; } } return n-step; } //方法二: int removeDuplicates(int A[], int n) { int index=0; for (int i = 0; i <= n-1;++i){ if (i!= n-1 && A[i]==A[i+1]) continue; A[index++]=A[i]; } return index; }
class Solution { public: int removeDuplicates(int A[], int n) { if (n == 0) return 0; int slow(1), fast(1); while(fast < n){ while(fast < n && A[fast] == A[fast-1]) fast++; if (fast < n) A[slow++] = A[fast++]; } return slow; } };使用快慢两个“指针”,慢指针指向新数组末尾的下一个位置,快指针遍历原数组,当快指针检测到某个数和前一个数不相同的时候,把这个数赋值给慢指针,然后快慢指针均向右移动一格,直到快指针遍历完数组,返回慢指针的值即为长度。
class Solution {
public:
int removeDuplicates(int A[], int n) {
if (n == 0) return 0; //空数组跳过
int i = 0, j = 0; //维护两个指针
while (++j < n) { //往后逐一遍历
if (A[i] != A[j]) { //如若相等则跳过
A[++i] = A[j]; //不相等则更新在i指针的后面 }
}
return ++i;
}
};
class Solution { public: int removeDuplicates(int A[], int n) { if(n <= 1) return n; int pos = 0, check = 1; while(check < n) { if(A[check] == A[pos]) { while(check < n && A[check] == A[pos]) check++; } if(check < n) { A[++pos] = A[check++]; } } return pos+1; } };