携手创作,共同成长!这是我参与「掘金日新计划 · 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 - 1nums中的所有值都 互不相同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
};