1. 题目解析与核心思路
LeetCode 228题"汇总区间"是一个典型的数组处理问题,要求我们将有序且无重复的整数数组转换为最小区间表示。这个问题看似简单,但考察了对数组遍历、边界条件处理以及字符串操作的综合能力。
1.1 题目要求详解
给定一个无重复元素的有序整数数组nums,我们需要返回一个区间列表,满足:
- 每个区间恰好覆盖数组中连续的数字
- 区间表示采用最小化原则
- 输出格式为:
- 单个数字:"a"(当a==b时)
- 区间范围:"a->b"(当a<b时)
例如:
- 输入[0,1,2,4,5,7] → 输出["0->2","4->5","7"]
- 输入[0,2,3,4,6,8,9] → 输出["0","2->4","6","8->9"]
1.2 解题思路拆解
解决这个问题的核心在于识别连续的数字序列。我们可以采用"滑动窗口"的思想:
- 初始化一个起点指针(start)指向当前区间的开始
- 遍历数组,检查当前元素是否与前一个元素连续(即nums[i] == nums[i-1]+1)
- 当遇到不连续的元素时:
- 将当前区间[start, i-1]转换为字符串格式
- 更新start指针到当前位置i
- 遍历结束后,处理最后一个区间
这种方法的优势在于只需一次遍历(O(n)时间复杂度),且空间复杂度仅为O(1)(不考虑输出结果的空间)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现与详细解析
2.1 C++实现版本
cpp复制class Solution {
public:
vector<string> summaryRanges(vector<int>& nums) {
vector<string> result;
int n = nums.size();
if (n == 0) return result;
int start = 0;
for (int i = 1; i < n; ++i) {
if (nums[i] != nums[i-1] + 1) {
if (start == i-1) {
