一起养成写作习气!这是我参与「掘金日新方案 4 月更文应战」的第26天,点击查看活动详情。

前言

咱们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 工作健身教练。)的 Swift 算法题题解收拾为文字版以方便咱们学习与阅读。

LeetCode 算法到现在咱们现已更新了 79 期,咱们会保持更新时刻和进展(周一、周三、周五早上 9:00 发布),每期的内容不多,咱们期望咱们可以在上班路上阅读,长久积累会有很大提升。

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果咱们有建议和意见欢迎在文末留言,咱们会尽力满足咱们的需求。

难度水平:中等

1. 描绘

给你一个有序数组 nums ,请你 原地 删去重复呈现的元素,使每个元素 最多呈现两次 ,回来删去后数组的新长度。

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

阐明:

为什么回来数值是整数,但输出的答案是数组呢?

请注意,输入数组是以 「引证」 方法传递的,这意味着在函数里修正输入数组关于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引证”方法传递的。也就是说,不对实参做任何复制
int len = removeDuplicates(nums);
// 在函数里修正输入数组关于调用者是可见的。
// 依据你的函数回来的长度, 它会打印出数组中 该长度范围内 的一切元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

2. 示例

示例 1

输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应回来新长度 length = 5, 而且原数组的前五个元素被修正为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后边的元素。

示例 2

输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应回来新长度 length = 7, 而且原数组的前五个元素被修正为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后边的元素。

约束条件:

  • 1 <= nums.length <= 3 * 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 已按升序排列

3. 答案

class RemoveDuplicatesFromSortedArrayII {
    func removeDuplicates(inout nums: [Int]) -> Int {
        guard nums.count > 2 else {
            return nums.count
        }
        var index = 1
        for i in 2..<nums.count {
            if nums[index] != nums[index - 1] || nums[index] != nums[i] {
                index += 1
                nums[index] = nums[i]
            } 
        }
        return index + 1
    }
}
  • 主要思维:保留一个索引,比较该索引处的元素、索引- 1处的元素以及向前移动的元素。
  • 时刻复杂度: O(n)
  • 空间复杂度: O(1)

该算法题解的库房:LeetCode-Swift

点击前往 LeetCode 操练

关于咱们

咱们是由 Swift 爱好者共同保护,咱们会分享以 Swift 实战、SwiftUI、Swift 根底为中心的技能内容,也收拾搜集优异的学习材料。