Python算法题解:删除排序数组的重复项

Leetcode第26题:删除排序数组的重复项

原题:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不能使用额外的数组空间,必须是原地修改输入的数组并使用O(1)额外空间条件下完成。

示例1

# 给定数组 nums = [1,1,2]
# 函数应该返回新的长度 2, 并且原数组nums的前两个元素被修改成 1,2
# 你不需要考虑数组中超出新长度后面的元素

这里题目中说的“原地删除”重复出现的元素,并不是说真的删除它。“你不需要考虑数组中超出新长度后面的元素”通过这句话我们能理解重新排序过的数组 nums = [1,1,2]列表中元素的个数并没有改变,就地删除其实是一种替换——[1,2,2]。原列表下标为 ‘1’ 的数组由数字1替换成了数字2,然后返回的新的数组长度为无重复的排序好的数组长度为 2。

题目说了给定的是排序数组——按升序排列好的一组数组(或者是降序,这都不重要,总之是有序的一组数组)。

问题分析:

当理解题目之后我们就可以很好的进行解体了,我们知道’就地删除‘重复的元素是替换,替换的是谁?那肯定是当前重复的元素的下一个元素。如果是替换,我们需要知道要替换的元素的下标,假如是列表[1,1,2],要替换(删除)谁?肯定是下标是 1 的重复的数字1啊。

nums = [1,1,2]
nums[1] = nums[2] # nums = [1,2,2]

运用双指针算法,设定一个慢的指针, 一个快的指针。慢的指针用来重组无重复的排序数组,快的指针用来跳过由重复的元素。

i, j = 0, 1
if nums[i] != nusm[j]:
    nums[i+1] = nusm[j]  # 当 j 指针找到不于 i 指针重复的数组元素时,把 i 指针前一个元素重新赋值(删除) j 指针指向的元素
    i += 1
    j += 1
if nums[i] == nums[j]:
    j += 1   # 就是如果nums[i] == nusm[j] j指针 +=1(所以它叫快指针) i指针不动(所以它是慢指针)

完成代码:

class Solution:
    def inPlacealGorithm(self, arr):
        n = len(arr)
        if n <= 1:
            return arr
        i, j = 0, 1
        while j < n:
            if arr[i] != arr[j]:
                arr[i+1] = arr[j]
                i += 1
                j += 1
            else:
                j += 1
        return i+1

你可能感兴趣的:(算法)