LeetCode - #228 汇总区间

84 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

前言

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

LeetCode 算法到目前我们已经更新到 226 期,我们会保持更新时间和进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。

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

难度水平:简单

1. 描述

给定一个  无重复元素 的 有序 整数数组 nums

返回 恰好覆盖数组中所有数字最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x

列表中的每个区间范围 [a,b] 应该按如下格式输出:

  • "a->b" ,如果 a != b
  • "a" ,如果 a == b

2. 示例

示例 1

输入:nums = [0,1,2,4,5,7]
输出:["0->2","4->5","7"]
解释:区间范围是:
[0,2] --> "0->2"
[4,5] --> "4->5"
[7,7] --> "7"

示例 2

输入:nums = [0,2,3,4,6,8,9]
输出:["0","2->4","6","8->9"]
解释:区间范围是:
[0,0] --> "0"
[2,4] --> "2->4"
[6,6] --> "6"
[8,9] --> "8->9"

提示:

  • 0 <= nums.length <= 20
  • -2^31 <= nums[i] <= 2^31 - 1
  • nums 中的所有值都 互不相同
  • nums 按升序排列

3. 答案

class SummaryRanges {
    func summaryRanges(nums: [Int]) -> [String] {
        var res = [String]()
        var str = ""
        var start = 0
        
        guard nums.count > 0 else {
            return res
        }
  
        for i in 0...nums.count {
            if i == nums.count || (i > 0 && nums[i] != nums[i - 1] + 1) {
                str = "\(nums[start])"
                if i - 1 != start {
                    str += "->\(nums[i - 1])"
                }
                res.append(str)
                start = i
            }
        }
        return res
    }
}
  • 主要思想:遍历数组并在 num[i] != num[i - 1] + 1 时构建字符串,注意在它到达数组末尾时处理边缘情况。
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

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

点击前往 LeetCode 练习