删除有序数组中的重复项

【题目描述】

给你一个有序数组 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 }

 

上一篇:pytorch python 常用命令


下一篇:字符串的调整与替换:将所有的“*“字符挪到左边,数字字符挪到右边(Java)