leetcode刷题记录-【26 Remove Duplicates from Sorted Array】

给定一个排序数组,你须要在原地删除重复出现的元素,使得每一个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。数组

划重点:1.排序数组 2.原地删除优化

错误思路:
1.声明一个tmp,初始就是nums[0],用做被比较的对象
2.用tmp去和每个后面的数去对比,相同的跳过,不一样的,先把nums[j]设成tmp,而后j++,tmp变成不一样的那个数
错误点:
1.使用了新的内存空间,是错误的
2.tmp要和后面的数去比,tmp若是走到了最后一个,那么后面必然会产生越界。
3.tmp最后必定是一个和前面不一样的数,这个数不参与比较,那么必定不会被覆盖写入数组
好比{1,1,2,2,3,3}->{1,2,2,2,3,3}指针

public static int removeDuplicates(int[] nums)
{
    int i = 0, j = 0;
    int tmp = nums[0];
    for(i = 1; i < nums.length; i++)
    {
        if(nums[i] == tmp)
        {
            continue;
        }
        else
        {
            nums[j] = tmp;
            tmp = nums[i];
            j++;
        }
    }
    System.out.println(j+1);
    return j+1;
}

思路:
要求原地删除,那么必定使用快慢指针进行元素的覆盖操做。
声明两个指针,i为快指针,j为慢指针
若是遇到相同的数,那么就跳过,i++。
若是遇到不一样的数,将这个值的下一个数给替换成这个不同的值。code

public static int removeDuplicates(int[] nums)
{
    int i = 0, j = 0;
    for(i = 1; i < nums.length; i++)
    {
        if(nums[j] == nums[i])
        {
            continue;
        }
        else
        {
            j++;
            nums[j] = nums[i];
        }

    }
    System.out.println(j+1);
    return j+1;
}

代码写的不够优雅,由于判断相等而后continue是没有必要的,优化一下:对象

public static int removeDuplicates(int[] nums)
{
    int j = 0;
    for(int i = 1; i < nums.length; i++)
    {
        if(nums[j] != nums[i])
        {
            j++;
            nums[j] = nums[i];
        }

    }
    return j+1;
}

复杂度分析:
遍历一遍,时间复杂度o(n)
空间复杂度,o(1)排序

相关文章
相关标签/搜索