163. Missing Ranges

163. Missing Ranges_第1张图片
题目截图

基本思路是使用一个变量来维护下一次 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 findMissingRanges(int[] nums, int lower, int upper) {
    String strTo = "->";
    List 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。

你可能感兴趣的:(163. Missing Ranges)