初级算法题解(力扣26. 删除有序数组中的重复项)

该问题要求在O(1)空间复杂度下,返回数组中不重复的元素个数及升序排序后的结果。通过使用双指针技巧,在原数组上进行操作,避免创建新数组。一个指针i用于遍历,另一个指针j用于记录不重复元素的末尾位置,当i处元素不等于j处元素时,更新j并将nums[i]赋值给nums[j]。

题目要求
判题标准
输入输出
在这里插入图片描述
题目要求输入一个数组,我们返回数组中不重复的个数和一个按升序排序的不重复的数组。同时这个数组不能是新定义的数组,必须在原来的数组上进行操作

首先我们思考,如果这道题没有要求在原来的数组上进行操作,那么就会非常简单,我们只需要新建一个数组,让原数组下标0的元素复制到新数组中,然后让原数组从0开始遍历,如果下一个数字与当前数字相等,则下标继续移动,遇到不等的情况,下标向下移动之后,将该数字增加到新数组中,最后将新数组返回即可。

但由于题目限制了O(1)的空间复杂度,也就是说我们不能新建数组,必须在原数组上进行操作。我们可以知道,在这个过程中,我们会有数组赋值的操作,即将数组后面不重复的数字赋值到前面
这时就需要指针指向前面后面,对不同的数字进行对比。如果我们只有一个指针,就非常难以操作,而采用“双指针”则可以很好地解决我们的问题。

int removeDuplicates(int* nums, int numsSize){
   int i,j=0;
   for(i=0;i<numsSize;i++)
   {
       if(nums[i]!=nums[j])
       {
           j++;
           nums[j] = nums[i];
       }
   }
   return j+1;
}

动态过程如视频所示:

力扣26

最后视频中j指向的下标是4,又由于我们数组中不重复的数字是5个,也就是j+1,故最终返回的是j+1

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值