(模拟) LeetCode 2848. 与车相交的点

原题链接

一. 题目描述

给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i,nums[i] = [starti, endi] ,其中 starti 是第 i 辆车的起点,endi 是第 i 辆车的终点。

返回数轴上被车 任意部分 覆盖的整数点的数目。


示例 1:

输入:nums = [[3,6],[1,5],[4,7]]
输出:7
解释:从 1 到 7 的所有点都至少与一辆车相交,因此答案为 7 。
示例 2:

输入:nums = [[1,3],[5,8]]
输出:7
解释:1、2、3、5、6、7、8 共计 7 个点满足至少与一辆车相交,因此答案为 7 。
 

提示:

1 <= nums.length <= 100
nums[i].length == 2
1 <= starti <= endi <= 100

二. 解题思路

本题也是非常简单,只需要统计汽车的开始时间和结束时间之间覆盖的点的个数即可,对于重复覆盖的点只需要统计一遍,可能有些同学想到使用哈希表去遍历数组,再将汽车的starti与endi之间的数字遍历,如果之前未出现则加入,出现过则不加入,这样应该也能做,但是可能会超时,我们有试过,感兴趣的小伙伴可以尝试一下,这里我讲一下我的做法:

首先我们将二维数组按照starti从小到大遍历一遍,主要是判断是否存在覆盖现象,然后我们设定两个初值start和end 用来统计当前车辆的开始和结束时间,初值设定为第一辆车的开始和结束时间。

然后从下标为1开始遍历数组nums,如果发现end的值大于等于nums[i][0],说明我们统计的车的区间与当前区间存在交集,所以我们需要将end 需要和当前的nums[i][1] 取一个最大值,从而解决了区间存在交集的现象;如果当前的end 小于当前的nums[i][0],说明二者之间没有交集,则将统计的区间收集结果(res += end - start + 1),并且将当前的nums[i][0] 和nums[i][1] 的值赋给start 和end ,再循环遍历即可。

再循环结束之后,start 和end 中存储的是最后一次的区间 ,所以我们还需要收集一次结果,res += end - start + 1;

话不多说!!!上代码!!

三. 代码

class Solution {
public:
    bool static com(vector<int>& a, vector<int>& b){
        return a[0] < b[0];
    }
    int numberOfPoints(vector<vector<int>>& nums) {
        sort(nums.begin(), nums.end(), com);
        int res = 0;
        int start = nums[0][0], end = nums[0][1];
        for(int i = 1; i < nums.size(); i++){
            if(end >= nums[i][0]){
                end = max(end, nums[i][1]);
            }else{
                res += end - start + 1;
                start = nums[i][0]; end = nums[i][1];
            }
        }
        res += end - start + 1;
        return res;
    }
};

四. 总结

本题属于简单题,需要大家动脑经思考一下该如何处理区间重复的现象,明白了问题也就迎刃而解了。

时间复杂度:O(Nlogn)

空间复杂度:O(1)

喜欢的话给个关注吧!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值