算法-Summary Ranges-汇总区间

本文介绍LeetCode中的算法问题——Summary Ranges,通过分析题目要求,讨论如何判断并输出连续元素,同时提供Java代码实现,并对时间、空间复杂度进行分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目描述

给定一个无重复元素的有序整数数组 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、题目分析

  • 将所有连续的元素按照要求的格式输出
  • 需要判断连续的元素是否是单个的
  • 需要两个变量记录左右边界

3、代码实现

class Solution {
    public List<String> summaryRanges(int[] nums) {
        List<String> res = new ArrayList<>();
        if(nums.length == 0) return res;
        int left = 0,right = 1;//左右边界
        while(right < nums.length){//更新左右边界
            if(nums[right] == nums[right - 1] + 1){
                right++;
            }else{
                //记录结果
                StringBuilder sb = new StringBuilder();
                if(right - left == 1){
                    sb.append(nums[left]);
                }else{
                    sb.append(nums[left]);
                    sb.append("->");
                    sb.append(nums[right - 1]);
                }
                res.add(sb.toString());
                left = right;
                right++;
            }
        }
        //最后的判断
        StringBuilder sb = new StringBuilder();
        if(right - left == 1){
            sb.append(nums[left]);
        }else{
            sb.append(nums[left]);
            sb.append("->");
            sb.append(nums[right - 1]);
        }
        res.add(sb.toString());
        //输出结果
        return res;
    }
}
//写的优雅一点
class Solution {
    public List<String> summaryRanges(int[] nums) {
        List<String> res = new ArrayList<>();
        // i 初始指向第 1 个区间的起始位置
        int i = 0;
        for (int j = 0; j < nums.length; j++) {
            // j 向后遍历,直到不满足连续递增(即 nums[j] + 1 != nums[j + 1])
            // 或者 j 达到数组边界,则当前连续递增区间 [i, j] 遍历完毕,将其写入结果列表。
            if (j + 1 == nums.length || nums[j] + 1 != nums[j + 1]) {
                // 将当前区间 [i, j] 写入结果列表
                StringBuilder sb = new StringBuilder();
                sb.append(nums[i]);
                if (i != j) {
                    sb.append("->").append(nums[j]);
                }
                res.add(sb.toString());
                // 将 i 指向更新为 j + 1,作为下一个区间的起始位置
                i = j + 1;
            }
        }
        return res;
    }
}

4、复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值