leetcode 面试经典 150 题:汇总区间

链接 汇总区间
题序号 228
题型 数组
解法 一次遍历法
难度 简单
熟练度 ✅✅✅

题目

给定一个 无重复元素 的 有序 整数数组 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 <= numsi <= 231 - 1

nums 中的所有值都 互不相同

nums 按升序排列

题解

  1. 核心思想 :
    • 遍历:遍历排序后的数组,记录每个连续区间的起始和结束位置。
    • 处理区间:在遍历过程中,如果当前元素与前一个元素不连续(即当前元素 - 前一个元素 > 1),则表示一个区间的结束,记录该区间并开始新的区间。
    • 生成结果:将记录的区间转换为字符串格式,添加到结果列表中
  2. 复杂度:时间复杂度 O(n),其中 n 为数组的长度;空间复杂度 O(1),除了用于输出的空间外,额外使用的空间为常数。
  3. to_string 函数:该函数用于将各种数据类型转换为字符串。它定义在 头文件中,可以处理多种数据类型,包括整数、浮点数等。
  4. c++ 实现算法:
cpp 复制代码
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) {

        // 检查是否到了数组末尾或非连续元素
        //nums[i] != nums[i - 1] + 1:当前元素与前一个元素不连续,进入 if 条件判断中。
        if (i == n || nums[i] != nums[i - 1] + 1) {

            if (start == i - 1) {
                // 单个元素
                //将单个元素转换成字符串形式放到容器中
                //to_string 函数是 C++ 标准库中的一个函数,用于将数值(整数或浮点数)转换为对应的
                // 字符串格式。它是 C++11 引入的一部分,定义在 <string> 头文件中。
                result.push_back(to_string(nums[start]));
            } 
            else {
                // 区间范围
                //将当前区间 [nums[start], nums[i-1]] 转化为 "start->end" 的字符串形式添加到结果。
                result.push_back(to_string(nums[start]) + "->" + to_string(nums[i - 1]));
            }

            start = i; // 更新新的起点,表示一个新的区间开始位置
        }
    }

    return result;
}
  1. 算法推演 :
    输入:{0, 1, 2, 4, 5, 7}
i numsi start 判断条件 操作 result
1 1 0 连续 (1 == 0 + 1) 不进入 if
2 2 0 连续 (2 == 1 + 1) 不进入 if
3 4 0 不连续 (4 != 2 + 1) 进入 if "0-\>2"
4 5 3 连续 (4 == 4 + 1) 不进入 if "0-\>2"
5 7 3 不连续 (7 != 5 + 1) 进入 if "0-\>2", "4-\>5"
6 超出范围 5 数组末尾(i==n) 进入if(start==6-1),单个元素 "0-\>2", "4-\>5", "7"
  1. c++ 完整 demo:
cpp 复制代码
#include <vector>
#include <string>
#include <iostream>
using namespace std;

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) {

        // 检查是否到了数组末尾或非连续元素
        //nums[i] != nums[i - 1] + 1:当前元素与前一个元素不连续,进入 if 条件判断中。
        if (i == n || nums[i] != nums[i - 1] + 1) {

            if (start == i - 1) {
                // 单个元素
                //将单个元素转换成字符串形式放到容器中
                //to_string 函数是 C++ 标准库中的一个函数,用于将数值(整数或浮点数)转换为对应的
                // 字符串格式。它是 C++11 引入的一部分,定义在 <string> 头文件中。
                result.push_back(to_string(nums[start]));
            } 
            else {
                // 区间范围
                //将当前区间 [nums[start], nums[i-1]] 转化为 "start->end" 的字符串形式添加到结果。
                result.push_back(to_string(nums[start]) + "->" + to_string(nums[i - 1]));
            }

            start = i; // 更新新的起点,表示一个新的区间开始位置
        }
    }

    return result;
}

// 测试代码
int main() {
    vector<int> nums = {0, 1, 2, 4, 5, 7};
    vector<string> result = summaryRanges(nums);

    for (const string& range : result) {
        cout << range << " ";
    }
    return 0;
}
相关推荐
for_ever_love__4 小时前
ACL 过滤检索实现:可见性模型、向量库 filter 与权限实时同步
vector·文档·过滤·acl·权限·检索·可见性
救救孩子把4 小时前
AI面试八股文-21_21-多模态Agent面试题-Vision-Language-Agent
人工智能·面试·职场和发展·llava·多模态agent
HPtiger4 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训4 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设
DongQiShanRen5 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CCblandy5 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
丑梨数据5 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
ShineWinsu6 小时前
对于JavaScript:JavaScript基础语法的解析
开发语言·前端·javascript·面试·web·基础语法·循环
erzong2317 小时前
Linux操作系统:线程概念与控制
linux·算法
救救孩子把7 小时前
AI面试八股文-13_12-AI 框架与运维面试题
运维·人工智能·面试