



题目要求输入一个数组,我们返回数组中不重复的个数和一个按升序排序的不重复的数组。同时这个数组不能是新定义的数组,必须在原来的数组上进行操作。
首先我们思考,如果这道题没有要求在原来的数组上进行操作,那么就会非常简单,我们只需要新建一个数组,让原数组下标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。
该问题要求在O(1)空间复杂度下,返回数组中不重复的元素个数及升序排序后的结果。通过使用双指针技巧,在原数组上进行操作,避免创建新数组。一个指针i用于遍历,另一个指针j用于记录不重复元素的末尾位置,当i处元素不等于j处元素时,更新j并将nums[i]赋值给nums[j]。
1450

被折叠的 条评论
为什么被折叠?



