欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

剑指leetcode—删除重复排序数组中的重复项

程序员文章站 2022-03-15 20:34:53
...

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

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

算法一
双指针法
算法
数组完成排序后,我们可以放置两个指针 i和 j,其中 i 是慢指针,而 j 是快指针。只要 nums[i]=nums[j]我们就增加j以跳过重复项。当我们遇到 nums[j]≠nums[i]时,跳过重复项的运行已经结束,因此我们必须把它(nums[j])的值复制到 nums[i+1]。然后递增 i,接着我们将再次重复相同的过程,直到 j 到达数组的末尾为止。
java实现

class Solution {
    public int removeDuplicates(int[] nums) {
        int p=0;//慢指针
        int q;//快指针
        for(q=1;q<nums.length;q++)
        {
            if(nums[q]!=nums[p])
            {                       
                nums[p+1]=nums[q];
            }
            p++}
            return p+1;
    }
}

根据上面的思路很容易实现c语言

算法优化

考虑这样的情况,如果数组中没有重复的元素,按照上面的方法,每次比较nums[p]和nums[q]不同时,会将q指向的元素原地复制一遍,这个操作是没有必要的。
因此我们还可以添加一个小小的判断,当q-p>1,才会进行复制。

class Solution {
    public int removeDuplicates(int[] nums) {
        int p=0;//慢指针
        int q;//快指针
        for(q=1;q<nums.length;q++)
        {
            if(nums[q]!=nums[p])
           {
               if(q-p>1)
               {              
                nums[p+1]=nums[q];
                }              
                p++;
            }
        }
            return p+1;
    }
}
   
相关标签: leetcode刷题之路