力扣题解:汇总区间

95 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

题目描述

原题链接 :

228. 汇总区间 - 力扣(LeetCode)

给定一个  无重复元素 的 有序 整数数组 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
  • -2^31 <= nums[i] <= 2^31 - 1
  • nums 中的所有值都 互不相同
  • nums 按升序排列

思路分析

  1. 创建一个List集合,循环遍历传入的数组 nums,
  2. 定义一个 boolean变量,若是数组中两个连续的数 差为1 则 boolean为true,
  3. 接着判断接下来的数的差是否为1,记录符合的数的个数,直到不符合要求退出while
  4. 判断 flog 为false/true,分情况将数 放入List集合

AC 代码

class Solution {
      public List<String> summaryRanges(int[] nums) {
        boolean flog  =false;
        int n;
        List<String> list = new ArrayList<String>();
        for (int i=0;i<nums.length;i++){
            n=0;
            while((i+1)<nums.length &&nums[i+1]-nums[i]==1 ){
                flog =true;
                i++;
                n++;
            }
            if (flog ){
                list.add(nums[i-n]+"->"+nums[i]);
                flog =false;
            }else{
                list.add(""+nums[i]);
            }
        }
        return list;
    }
}

参考

Pythonic 一行99%的偷懒流(没有推导式的side effects(副作用 - 汇总区间 - 力扣(LeetCode)

C++,利用双指针表示左右区间,主体模块逻辑清晰 - 汇总区间 - 力扣(LeetCode)

C++ 0ms 10行简单实现, 击败双百 - 汇总区间 - 力扣(LeetCode)