​LeetCode刷题实战163:缺失的区间

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 缺失的区间  ,我们先来看题面:

https://leetcode-cn.com/problems/missing-ranges/

Given a sorted integer array where the range of elements are [lower, upper] inclusive, return its missing ranges.

For example, given [0, 1, 3, 50, 75], lower = 0 and upper = 99, return ["2", "4->49", "51->74", "76->99"].

题意

给定一个排序的整数数组 nums ,其中元素的范围在 闭区间 [lower, upper] 当中,返回不包含在数组中的缺失区间。

样例

示例:

输入: nums = [0, 1, 3, 50, 75], lower = 0 和 upper = 99,
输出: [“2”, “4->49”, “51->74”, “76->99”]

解题

http://www.voidcn.com/article/p-qjcfguyv-b.html

我们用一个指针prev记录上次range的结尾,一个指针curr记录当前遍历到的数字,如果curr和prev相差大于1,说明一个missing range,我们将其加入结果列表中就行了。这题主要是有几个corner case要解决:

  1. 如何处理lower到第一个数,和最后一个数到upper的missing range?

  2. 如何区分range中只有一个数和多个数?

  3. 如何有效的得到missing range的起始和结束值,同时保证不会包含数组中的数字?

对于第一个问题,我们要做的就是在让for循环多判断两次。想象一下假设数组前有一段连续的负无穷到lower-1,数组后有一段upper+1到正无穷,这样是等价与上下界的。本来如果不考虑头尾,那for循环本应是从1到length-1的,但是为了判断头,我们从0开始,将下标为0的数和lower-1比较得到第一个range。最后循环到length停止,当下标为length时,我们将当前指针指向upper+1,并判断upper+1和数组末尾是否能构成最后一个区间。

对于第二个问题,我们只要判断这个区间的起止是否一样就行了

对于第三个问题,我们用prev+1和curr-1来标记这个区间的起止,因为prev和curr都是数组中的数,所以解决了每个区间的边界问题

public class Solution {
    public List<String> findMissingRanges(int[] nums, int lower, int upper) {
        List<String> res = new LinkedList<String>();
        // 初始化prev为lower-1,判断是否存在“第一个”区间
        int prev = lower - 1, curr = 0;
        for(int i = 0 ; i <= nums.length; i++){
            // 当遍历到length时,设置curr为upper+1,判断是否存在“最后一个”区间
            curr = i == nums.length ? upper + 1 : nums[i];
            // 如果上一个数和当前数相差大于1,说明之间有区间
            if(curr - prev > 1){
                res.add(getRanges(prev+1, curr-1));
            }
            prev = curr;
        }
        return res;
    }
    
    private String getRanges(int from, int to){
        return from == to ? String.valueOf(from) : from + "->" + to;
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-160题汇总,希望对你有点帮助!

LeetCode刷题实战161:相隔为1的编辑距离

LeetCode刷题实战162:寻找峰值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值