C++/Python描述 LeetCode 228. 汇总区间 每日一题(2021年1月10日)

C++/Python描述 LeetCode 228. 汇总区间 每日一题(2021年1月10日)

  大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官劼的博客 ,同时正在尝试在B站中做一些内容分享,B站主页为: 亓官劼的B站主页

本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!!
若需联系博主,可以联系本人微信:qiguanjie2015


题目

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

示例 3:

输入:nums = []
输出:[]

示例 4:

输入:nums = [-1]
输出:["-1"]

示例 5:

输入:nums = [0]
输出:["0"]

提示:

  • 0 <= nums.length <= 20
  • -231 <= nums[i] <= 231 - 1
  • nums 中的所有值都 互不相同
  • nums 按升序排列

题解一:C++描述

这里可以使用动规的思想,从开始结点开始向前走,记录连续序列的start和end,当不连续时,在ans中添加当前连续序列的结果,并更新start值即可,在最后一个结点处做边界处理,代码对关键步骤做了注释。

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        int len = nums.size();
        int start,end;
        vector<string> ans;
        // 如果当前nums是空,则直接返回刚创建的空ans
        if(len == 0)
            return ans;
        // 初始化开始坐标,这里注意是nums[0],而不是0
        start = nums[0];
        for(int i = 0 ; i < len; i++){
            // 最后一个结点进行特殊处理,直接作为end坐标开始判断,执行后continue进入下一个循环,即直接结束
            if(i == len-1){
                end = nums[len-1];
                if(start == end){
                    string temp = to_string(start);
                    ans.push_back(temp);
                }else{
                    string temp = to_string(start) + "->" + to_string(end);
                    ans.push_back(temp);
                }
                continue;
            }
            // 如果当前不连续,则当前为end坐标,在ans内添加信息,并更新start坐标
            if(nums[i] + 1 != nums[i+1]){
                end = nums[i];
                if(start == end){
                    string temp = to_string(start);
                    ans.push_back(temp);
                }else{
                    string temp = to_string(start) + "->" + to_string(end);
                    ans.push_back(temp);
                }
                // 注意这里更新的坐标是nums[i+1]
                start = nums[i+1];
            }
        }
        return ans;
    }
};

执行效率为:

在这里插入图片描述

解法二:Python解法

这里Python和C++用的是同一种解法,仅是使用语言不同,本质完全一样,如有使用Python语言的同学可以看看。

这里可以使用动规的思想,从开始结点开始向前走,记录连续序列的start和end,当不连续时,在ans中添加当前连续序列的结果,并更新start值即可,在最后一个结点处做边界处理,代码对关键步骤做了注释。

class Solution:
    def summaryRanges(self, nums: List[int]) -> List[str]:
        ans = []
        n = len(nums)
        # 如果n == 0即nums为空,直接返回
        if n == 0:
            return ans;
        # 初始化开始坐标,这里注意是nums[0],而不是0
        start = nums[0]
        end = nums[0]
        for i in range(0,n):
            #  最后一个结点进行特殊处理,直接作为end坐标开始判断,执行后continue进入下一个循环,即直接结束
            if i == n-1:
                end = nums[i]
                if(start == end):
                    ans.append(str(start))
                else:
                    ans.append(str(start) + "->" + str(end))
                continue
            # 如果当前不连续,则当前为end坐标,在ans内添加信息,并更新start坐标
            if nums[i]+1 != nums[i+1]:
                end = nums[i]
                if(start == end):
                    ans.append(str(start))
                else:
                    ans.append(str(start) + "->" + str(end))
                # 注意这里更新的坐标是nums[i+1]
                start = nums[i+1]
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亓官劼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值