【题目描述】
给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
【示例 1】
输入:nums = [1,1,2] 输出:2, nums = [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] 解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
【题目分析】
题目已说明是有序数组,且nums数组已按升序排列,则重复的元素一定出现在附近。
数组可能为空,需要对数组进行判空操作。
要特别注意的是,题目要求使用O(1)的空间复杂度,即必须在原数组上操作,不能创建新数组用于存储。
考虑使用双指针将所有不重复的元素移动到数组的最左边,然后输出指针下标。
设置 i=0 和 j=1 的两个指针,比较 i 和 j 位置的元素是否相等。
如果相等,j 后移 1 位
如果不相等,将 j 位置的元素复制到 i+1 位置上,i 后移一位,j 后移 1 位
重复上述过程,直到 j 等于数组长度。
返回 i + 1,即为新数组长度。
【实现代码】
1 class Solution { 2 public int removeDuplicates(int[] nums) { 3 if(nums.length==0||nums.length==1){ 4 return nums.length; 5 }else{ 6 int i=0; 7 int j=1; 8 while(j<nums.length){ 9 if(nums[i]==nums[j]){ 10 j++; 11 }else{ 12 nums[i+1]=nums[j]; 13 i++; 14 } 15 } 16 return i+1; 17 } 18 } 19 }