163. Missing Ranges

题目截图

基本思路是使用一个变量来维护下一次 range 的起始值,比较该起始值和当前 item, 分为两种情况:

  1. 如果是连续的,更新下一次起始值
  2. 如果是不连续的,添加 range,然后更新下一次起始值。range 的计算又分为两种情况:
    2.1 当前 item 虽然与起始值不连续,但 difference 相差 1,例如 (1, 3) 的情况,那么只需要添加 "2"
    2.2 不连续,且difference 相差大于 1,那么新的range 为 起始值->(item - 1)
    2.3 上面的两种情况计算 range,实际上就是计算 rangeStart, rangeEnd,如果两者相等,只添加一个数的String,若是不等,添加一个范围。这个是题目要求的,实际上也有相关的问题直接使用 range, 即便 rangeStart 与 rangeEnd 可能相等。

YouTube 题解链接

我的题解思路基本和上面的类似,只是我对待起始值的方式,同当前 item 一样,是 range 的边界,但都不被 range 包含。代码如下:

public List<String> findMissingRanges(int[] nums, int lower, int upper) {
    String strTo = "->";
    List<String> res = new LinkedList<>();
    
    long start = (long)lower - 1;
    for (int num: nums) {
        long diff = num - start;
        if (diff > 2) {
            String missing = (start + 1) + strTo + (num - 1);
            res.add(missing);
        } else if (diff == 2) {
            String missing = (start + 1) + "";
            res.add(missing);
        }
        start = num;
    }

    // 处理 upper,和上面类似:check if (upper + 1 - start >= 2)
    if (upper - start >= 1) {
        String missing = (upper - start == 1) ? (start + 1) + "" : (start + 1) + strTo + upper;
        res.add(missing);
    }
    
    return res;
}

这里直接使用了 long 型,原因是 edge cases [0, Integer.MAX_VALUE], [Integer.MIN_VALUE, Integer.MAX_VALUE], 加减1都会 overflow。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容