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) 肯定就溢出了= =

相关推荐
TDengine (老段)38 分钟前
TDengine 中 TDgpt 异常检测的数据密度算法
java·大数据·算法·时序数据库·iot·tdengine·涛思数据
自由随风飘39 分钟前
旅游城市数量最大化 01背包问题
数据结构·c++·算法·动态规划·旅游
YuTaoShao1 小时前
【LeetCode 热题 100】155. 最小栈
java·算法·leetcode
Warren981 小时前
MySQL查询语句详解
java·开发语言·数据库·mysql·算法·蓝桥杯·maven
AWEN_331 小时前
斐波那契数
算法
好好先森&1 小时前
C语言:冒泡排序
c语言·数据结构·算法·遍历·冒牌排序
肉夹馍不加青椒2 小时前
第二十三天(数据结构:链表补充【希尔表】)
数据结构·链表
李永奉2 小时前
C语言-字符串(定义)、字符串函数(strlen、strcat、strcpy、strcmp、strlwr、strupr)
c语言·开发语言·算法
啊阿狸不会拉杆3 小时前
《Java 程序设计》核心知识点梳理与深入探究
java·开发语言·python·算法·php·intellij-idea
行然梦实3 小时前
世代距离(GD)和反转世代距离(IGD)详析
人工智能·算法·机器学习·数学建模