leetcode228. 汇总区间

题目

给定一个 无重复元素有序 整数数组 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"

自己的思路:

也是双指针,但是在边界情况不知道如何处理。

就是怎么可以避免fast == len的时候,再让它减1,

cpp 复制代码
class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        vector<string> vs;
        map<int, int> mp;
        int low = 0, fast = 0;
        int len = nums.size();

        while(low != len){
            fast++;
            if((fast == len) || (nums[fast] != nums[low] + fast - low)){
                mp[nums[low]] = nums[fast - 1];
                low = fast;
            } 
        }

        for(map<int, int>::iterator it = mp.begin(); it!= mp.end(); it++){
            string str;
            if(it->first == it->second){
                str = to_string(it->first);
            }else {
                str = to_string(it->first) + "->" + to_string(it->second);
            }
            vs.push_back(str);
        }

        return vs;

    }
};

看了题解之后的做法:

思路:

双指针。从前往后遍历,low在前,high在后跑,如果high跑着发现它跟前面那个值相差不为1,说明这个区间在这里断了。就需要把这个区间存储起来,然后low更新为现在的high继续跑。直到跑到len为止。

这里使用 map 来存储区间,键key存区间开始,值value存区间终点。最后在输出的时候,判断键值是否相等,如果相等,就输出该值自己,如果不相等,就输出该区间。

代码:

cpp 复制代码
class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        vector<string> vs;
        map<int, int> mp;
        int low = 0, high = 0;
        int len = nums.size();
        int i = 0;
        while (i < len) {
            low = i;
            i++;
            while (i < len && nums[i] == nums[i - 1] + 1) { // 注意点1
                i++;
            }
            high = i - 1;
            mp[nums[low]] = nums[high];
        }

        for(map<int, int>::iterator it = mp.begin(); it!= mp.end(); it++){
            string str;
            if(it->first == it->second){
                str = to_string(it->first);
            }else {
                str = to_string(it->first) + "->" + to_string(it->second);
            }
            vs.push_back(str);
        }

        return vs;

    }
};

需要注意的点:

1.在判断区间断点时,如果用 nums[i]-nums[i-1] == 1 来判断的话,会发生如下情况:

原因分析:

因为int型可以表示的范围是:-2147483648 ~ 2147483647。

这里 2147483647- (-2147483647) 肯定就溢出了= =

相关推荐
LNTON羚通2 小时前
摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现
算法·目标检测·音视频·监控·视频监控
哭泣的眼泪4083 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
清炒孔心菜4 小时前
每日一题 LCR 078. 合并 K 个升序链表
leetcode
Microsoft Word4 小时前
c++基础语法
开发语言·c++·算法
天才在此4 小时前
汽车加油行驶问题-动态规划算法(已在洛谷AC)
算法·动态规划
莫叫石榴姐5 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
茶猫_6 小时前
力扣面试题 - 25 二进制数转字符串
c语言·算法·leetcode·职场和发展
Hera_Yc.H7 小时前
数据结构之一:复杂度
数据结构
肥猪猪爸8 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
linux_carlos8 小时前
环形缓冲区
数据结构