当前位置: 首页 > article >正文

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

题解

  1. 核心思想
    • 遍历:遍历排序后的数组,记录每个连续区间的起始和结束位置。
    • 处理区间:在遍历过程中,如果当前元素与前一个元素不连续(即当前元素 - 前一个元素 > 1),则表示一个区间的结束,记录该区间并开始新的区间。
    • 生成结果:将记录的区间转换为字符串格式,添加到结果列表中
  2. 复杂度:时间复杂度 O(n),其中 n 为数组的长度;空间复杂度 O(1),除了用于输出的空间外,额外使用的空间为常数。
  3. to_string 函数:该函数用于将各种数据类型转换为字符串。它定义在 头文件中,可以处理多种数据类型,包括整数、浮点数等。
  4. c++ 实现算法
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}
inums[i]start判断条件操作result
110连续 (1 == 0 + 1)不进入 if[ ]
220连续 (2 == 1 + 1)不进入 if[ ]
340不连续 (4 != 2 + 1)进入 if[“0->2”]
453连续 (4 == 4 + 1)不进入 if[“0->2”]
573不连续 (7 != 5 + 1)进入 if[“0->2”, “4->5”]
6超出范围5数组末尾(i==n)进入if(start==6-1),单个元素[“0->2”, “4->5”, “7”]
  1. c++ 完整 demo
#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;
}

http://www.kler.cn/a/506288.html

相关文章:

  • 微软开源AI Agent AutoGen 详解
  • docker一张图理解
  • 基于 requests 依赖包的 Python 爬虫实战
  • BIO、NIO、AIO
  • docker安装mysql 5.7
  • SpringCloud源码-Ribbon
  • 深度神经网络的校准问题研究:从架构差异到温度缩放优化
  • 【编程语言】C/C++语言常见标准和规范
  • Ubuntu18.04 解决 libc.so.6: version `GLIBC_2.28‘ not found
  • 台达、汇川伺服
  • 指针的进阶
  • 从漏洞管理到暴露管理:网络安全的新方向
  • 编译pytorch——cuda-toolkit-nvcc
  • SQL-leetcode—1068. 产品销售分析 I
  • 微信小程序研学自习室选座与门禁系统的实现与开发springboot+论文源码调试讲解
  • 【C语言4】数组:一维数组、二维数组、变长数组及数组的练习题
  • 【网络】DNS解析流程
  • 一、I2C客户端驱动 —— bmp280
  • 智能化交易的新时代:中阳模型的突破与应用
  • 鸿蒙面试 2025-01-13
  • 申论对策类【2020国考地市第四题】
  • 迅为RK3576开发板Android 多屏显示
  • 深入 Flutter 和 Compose 在 UI 渲染刷新时 Diff 实现对比
  • 【Golang/nacos】nacos配置的增删查改,以及服务注册的golang实例及分析
  • 【PCIE734-1 】基于 PCIe 总线架构的 XCKU060 FPGA 4 路 SFP+光纤通道处理平台
  • 一路相伴,非凸科技助力第49届ICPC亚洲区决赛