LeetCode 228. 汇总区间
题目描述
思路分析
解法一:双指针线性扫描(推荐)
核心思路:
- 维护当前区间起点
start与上一元素prev。- 当出现断层(
nums[i] != prev + 1)时,结算[start, prev]区间。- 继续从新起点开始,最后别忘记结算尾区间。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示数组长度。
- 空间复杂度:O(1),忽略输出占用。
import java.util.*;
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> res = new ArrayList<>();
if (nums.length == 0) {
return res;
}
int start = nums[0];
int prev = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] == prev + 1) {
prev = nums[i];
continue;
}
res.add(formatRange(start, prev));
start = nums[i];
prev = nums[i];
}
res.add(formatRange(start, prev));
return res;
}
private String formatRange(int start, int end) {
if (start == end) {
return String.valueOf(start);
}
return start + "->" + end;
}
}
import "strconv"
func summaryRanges(nums []int) []string {
res := []string{}
if len(nums) == 0 {
return res
}
start := nums[0]
prev := nums[0]
for i := 1; i < len(nums); i++ {
if nums[i] == prev+1 {
prev = nums[i]
continue
}
res = append(res, formatRange(start, prev))
start = nums[i]
prev = nums[i]
}
res = append(res, formatRange(start, prev))
return res
}
func formatRange(start int, end int) string {
if start == end {
return strconv.Itoa(start)
}
return strconv.Itoa(start) + "->" + strconv.Itoa(end)
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 163. 缺失的区间 | 简单 | 区间扫描 |
| 128. 最长连续序列 | 中等 | 哈希表 |
| 56. 合并区间 | 中等 | 区间处理 |
| 57. 插入区间 | 中等 | 区间处理 |
| 989. 数组形式的整数加法 | 简单 | 数组遍历 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!