美文网首页
swift 删除排序数组中的重复项

swift 删除排序数组中的重复项

作者: 光光6 | 来源:发表于2021-10-13 14:27 被阅读0次

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

例1:给定一个数组nums为[1,4,3,2,1],去掉重复元素应该返回4

输入:nums = [0,0,1,1,2]

输出:3, nums = [0,1,2]

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

例2:

输入:nums = [1,4,3,2,1]

输出:4, nums = [1,2,3,4]

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

1)数组排序再遍历数组,取出不同的数字存储在临时数组中,最后将临时数组赋值给原数组,即为所求

 //MARK:- 删除重复项

    funccheckRemoveDuplicates(_nums:inout[Int]) ->Int{

        ifnums.count==0{

                return0

            }

          nums = nums.sorted()

            varcurrent :Int= nums[0]

            //存储不同的数字

            varidx : [Int] = [current]

            //  遍历

            foriin1..<nums.count{

                ifcurrent==nums[i] {

                    continue

                }else{

                    idx.append(nums[i])

                    current = nums[i]

               }

            }

            nums = idx

            print(nums)

        return nums.underestimatedCount

    }

2)双指针法,符合题目要求

先数组排序后,定义连个指针 i 和 j ,其中 i 是慢指针,代表数组中连续不重复的数字的下标,j是快指针,代表原数组的下标,遍历数组,只要 nums[i] = nums[j] , 就增加 j 跳过重复的数字,当 nums[i] != nums[j] 时,就把num[j]的值赋值到num[i+1]中,然后i递增,依次重复上述过程至数组达到末尾

   //MARK:- 删除重复项

    funccheckRemoveDuplicates(_nums:inout[Int]) ->Int{

        ifnums.count==0{

            return0

        }

        nums = nums.sorted()

        //慢指针,代表不同数组的下标

        vari =0

        //j为快指针

        forjin1..<nums.count{

            ifnums[j]!=nums[i] {

                i+=1

                nums[i] = nums[j]

            }

        }

        print(nums[0...i])

        returni+1

    }

3)时间复杂度:O(n)

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

相关文章

网友评论

      本文标题:swift 删除排序数组中的重复项

      本文链接:https://www.haomeiwen.com/subject/cjosoltx.html