刷题日记——Day2 LeetCode.32删除有序数组中的重复项

本文介绍了一种使用双指针解决数组去重问题的方法,通过比较相邻元素并替换不同值来达到去除重复的目的。作者提供了两种代码实现,并分析了其时间复杂度为O(n)、空间复杂度为O(1)的特点,同时指出代码优化和避免数组越界的重要性。
摘要由CSDN通过智能技术生成

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.代码简洁优美

        本题题目并不复杂,其方法非常经典,利用双指针解题,大大简化问题,并且在一定程度上节省了时间。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值