1.题目描述
2.思路
本题考查——双指针,利用双下标“指针”,一个从首位开始指向待替换的元素位置,另一个从第二位开始,找到不同进行替换,相同继续寻找
3.解题方法
算法步骤:
(1)初始化,使用两个下标指针i和j,i=0,j=1
(2)利用j寻找和下标是i的值的不同值(非严格递增序列,要用循环)
(3)i指向下一位置(需要替换),将arr[i] = arr[j],j指向下一位置
(4)重复(2)(3),直到j等于数组长度
4.复杂度
时间复杂度:O(n)
空间复杂度:O(1)
5.Code
int removeDuplicates(int* nums, int numsSize)
{
//建立两个下标指针
int i = 0,j = 1;
while(j < numsSize)
{
if(nums[i] != nums[j])
{
i++;
nums[i] = nums[j];
j++;
if(j >= numsSize)
{
break;
}
}
while(nums[i] == nums[j])
{
j++;
if(j >= numsSize)
{
break;
}
}
}
return (i+1);
}
6.总结
思路没有什么问题,代码还有待优化。我写的代码中,需要注意数组越界访问,本人在提交过程中就出现了该错误。当然,评论区中的代码特别简介优美,思路也与其相同:
int removeDuplicates(int* nums, int numsSize) {
int k = 1;
int i = 0;
for (i = 1; i < numsSize; i++)
{
if (nums[i] != nums[i-1])
{
nums[k++] = nums[i];
}
}
return k;
}
代码说明:
(1)k作为慢指针,初始化指向第二个元素,因为第一个元素不可能重复
(2)i作为快指针,进行寻找,若nums[i] == nums[i-1],则i++
(3)当找到下标为i的元素与前一位元素不同,证明找到不同数值的元素则进行交换,并且慢指针加1,指向下一位待替换元素的位置
优点:
1.空间复杂度为O(1)
2.不需要担心数组访问越界的问题
3.代码简洁优美
本题题目并不复杂,其方法非常经典,利用双指针解题,大大简化问题,并且在一定程度上节省了时间。