原题链接
一. 题目描述
给你一个下标从 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)