君の冒険的な夢は那些你很冒险的梦

删除有序数组中的重复项

IcyYs·2022-01-27 22:44·68 次阅读

删除有序数组中的重复项

【题目描述】

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

 

posted @   IcyYs  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示