【leetcode】228. 汇总区间

213 阅读1分钟

leetcode-228.png

这里的思路比较简单,使用start还有last来分别指向区间的首尾
遍历数组的时候使用当前的数字与last相比
如果差距大于1,那么就要封存当前区间了
如果区间刚好等于1,那么就继续下一个遍历

初版

var summaryRanges = function (nums) {
    if (nums.length === 0) return []
    if (nums.length === 1) return [nums[0] + '']
    let res = []
    let start = nums[0]
    let last = nums[0]
    for (let i = 1; i < nums.length; ++i) {
        // 封存当前区间,更新start以及last
        if (nums[i] - last > 1) {
            if (last === start) {
                res.push(start + '')
            } else {
                res.push(start + '->' + last)
            }
            start = nums[i]
            last = nums[i]
        } else {
            // 更新last
            last = nums[i]
        }
    }
    // 统计最后一个区间
    if (last === start) {
        res.push(start + '')
    } else {
        res.push(start + '->' + last)
    }
    return res
};

优化版

last 可以使用 nums[i-1] 代替

var summaryRanges = function (nums) {
    if (nums.length === 0) return []
    if (nums.length === 1) return [nums[0] + '']
    let res = []
    let start = nums[0]
    for (let i = 1; i <= nums.length; ++i) {
        if (i === nums.length || nums[i] - nums[i - 1] > 1) {
            // 最后一个元素与开始相同,那么就是单独的元素
            if (start === nums[i - 1]) {
                res.push('' + start)
            } else {
                // 不同则是一个区间
                res.push(start + '->' + nums[i - 1])
            }
            // 进入第一个if则代表此时区间要更替了,此时要替换start
            if (i < nums.length) {
                start = nums[i]
            }
        }
    }
    return res
};