「前端刷题」228.汇总区间(EASY)

100 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

题目(Summary Ranges)

链接:https://leetcode-cn.com/problems/summary-ranges
解决数:887
通过率:56.1%
标签:数组 
相关公司:google indeed amazon 

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

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

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

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

 

示例 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
  • -231 <= nums[i] <= 231 - 1
  • nums 中的所有值都 互不相同
  • nums 按升序排列

思路

1、数组长度为1时,返回即可

2、数组长度大于1时,循环遍历,每个元素再做一次内循环,判断后一个元素是否比前一个元素大1,是的话外循环索引++,否则退出内循环,拼接结果

var summaryRanges = function(nums) {
    let result = []
    if (nums.length === 1) {
        result.push(`${nums[0]}`)
    } else {
        for (let i = 0; i < nums.length; i++) {
            let curr = nums[i]
            while(i + 1 < nums.length && (nums[i+1] - nums[i] === 1)) {
                i++
            }
            if (curr !== nums[i]) {
                result.push(`${curr}->${nums[i]}`)
            } else {
                result.push(`${curr}`)
            }
        }
    }
    return result
};

一般这种求区间的都可以使用双指针来解决,用两个指针一个保存区间起点,一个保存终点即可。

在这个题目中,我们只需要判断什么时候移动指针/扩大区间即可 当我们的数字是连续的时候,通过nums[i] + 1 === nums[i+1]可以判断是否连续

  • 如果连续,那么把这个i加入我们的区间。 end = i
  • 如果不连续,那么把这个区间剪掉,保存,并且重新开始一个新区间即可。start = end = i+1

代码

/**
 * @param {number[]} nums
 * @return {string[]}
 */
var summaryRanges = function(nums) {
  let start = 0
  let end = 0
  let ans = []
  nums.push(Infinity) //我他妈直接抄小路因为我们要判断nums[i+1],只能遍历到nums.length-1。后续处理比较麻烦,不如直接给它加个无穷大
  for(let i=0;i'+nums[end])
      }
      //重置新区间,新区间要从下一个开始
      start = end = i+1
    }
  }
  return ans
};