LeetCode 26. 删除有序数组中的重复项

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 26. 删除有序数组中的重复项相关的知识,希望对你有一定的参考价值。

删除排序数组中的重复项

题目描述

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

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

输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

思路描述

因为数组是排序的,只要是相同的肯定是挨着的,我们只需要遍历所有数组,然后前后两两比较,如果有相同的就把后面的给删除。

1,双指针解决

使用两个指针,右指针始终往右移动,

  • 如果右指针指向的值等于左指针指向的值,左指针不动。
  • 如果右指针指向的值不等于左指针指向的值,那么左指针往右移一步,然后再把右指针指向的值赋给左指针。

Java

//双指针解决
public int removeDuplicates(int[] A) 
    //边界条件判断
    if (A == null || A.length == 0)
        return 0;
    int left = 0;
    for (int right = 1; right < A.length; right++)
        //如果左指针和右指针指向的值一样,说明有重复的,
        //这个时候,左指针不动,右指针继续往右移。如果他俩
        //指向的值不一样就把右指针指向的值往前挪
        if (A[left] != A[right])
            A[++left] = A[right];
    return ++left;

或者还可以换一种解法,其实原理都是一样的。

public int removeDuplicates(int[] A) 
    int count = 0;//重复的数字个数
    for (int right = 1; right < A.length; right++) 
        if (A[right] == A[right - 1]) 
            //如果有重复的,count要加1
            count++;
         else 
            //如果没有重复,后面的就往前挪
            A[right - count] = A[right];
        
    
    //数组的长度减去重复的个数
    return A.length - count;

  1. 常规操作,先去除异常场景。把数组是null和数组为空的情况排除。
  2. 由于题目要求只能在原数组上删除,且该数组是个排好序的数组。那么我们可以定义一个游标 index,来记录需要替换为后面数据的位置。由于第一个元素肯定是要保留在数组中的,因此起始,我们将游标指向数组的第二个元素(此位置为可能替换元素的位置),数组下标指向第二个元素。
  3. 判断游标指向位置的前一个元素的值和当前获取的数组下标值是否相同。若相同,则游标位置不变,数组下标后移。若不同,代表需要把新元素替换到游标指向的位置。则替换元素,并且游标指向下一个位置,计数项加一。
public int removeDuplicates(int[] nums) 
        if (nums == null || nums.length == 0) 
            return 0;
        

        int count = 1;
        int index = 1;
        for (int i = 1; i < nums.length; i++) 
            if (nums[i] == nums[index - 1]) 
                continue;
            
            nums[index] = nums[i];
            index++;
            count++;
        
        return count;
    

Python

Python逆序删除:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        for i in range(len(nums) - 1, 0, -1):
            if nums[i] == nums[i - 1]:
                del nums[i]
        return len(nums)

逆序的原因正是基于我们删除一个值 他后面的值会往前移

[1, 2, 3, 4]
当 i = 1 的时候,你删除了元素 2 ,然后元素 3 的下标就会变成 1,在下一次循环的时候,就会把 3
跳过,所以需要逆序。

While循环可以实现正序删除

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        i = 0
        while i < len(nums)-1:
            if nums[i] == nums[i+1]:
                del nums[i]
            else:
                i += 1
        
        return len(nums)

加油!

感谢!

努力!

以上是关于LeetCode 26. 删除有序数组中的重复项的主要内容,如果未能解决你的问题,请参考以下文章

算法leetcode|26. 删除有序数组中的重复项(rust重拳出击)

算法leetcode|26. 删除有序数组中的重复项(rust重拳出击)

LeetCode 26. 删除有序数组中的重复项

LeetCode 26.删除有序数组中的重复项

LeetCode 26 删除有序数组中的重复项

Leetcode刷题100天—26. 删除有序数组中的重复项(数组)—day76