2848. 与车相交的点 Easy
给你一个下标从 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 。
解题思路
输入:一个二维整数数组 nums,每个值都代表第 i 个车的停车岂止坐标
输出:返回被车覆盖的整数点的数目
本题属于一维差分问题。
我们首先要知道总共的坐标范围是 [1, 100]
所以这个问题就是在问在 0-100 之内有哪些区域被车覆盖了
我们可以定义一个差分数组 diff = [0] * 102
,这里 102是为了预留 end + 1
为 0
然后我们遍历每辆车的覆盖区间并记录每个区间的开始 +1,结束 -1
我们可以得到这样一个差分数组 [...1,0,0,0,-1,...1,0,0,-1...]
然后遍历这个差分数组,当发现这个点 > 0
则说明这个区间开始有车覆盖了,当下次遇到 < 0
的时候说明这个覆盖区间结束了
然后判断区域是否被覆盖 cover += diff[i]
, cover > 0
则说明被覆盖
覆盖则count += 1
,没有则不增加 count
最后返回 count
代码实现
python
class Solution:
def numberOfPoints(self, nums: List[List[int]]) -> int:
# 数轴最大只到 100,差分数组范围设为 0~101,预留 end+1
diff = [0] * 102
# 遍历每辆车的覆盖区间,使用差分打标记
for start, end in nums:
diff[start] += 1 # 区间起点 +1,表示从这里开始被覆盖
diff[end + 1] -= 1 # 区间终点+1 处 -1,表示从这里开始不再被覆盖
# 遍历差分数组做前缀和,还原每个位置被覆盖的次数
count = 0 # 统计被至少覆盖一次的点数
coverage = 0 # 当前点的累计覆盖次数
for i in range(102):
coverage += diff[i] # 前缀和恢复当前点的覆盖值
if coverage > 0:
count += 1 # 被至少一辆车覆盖的点,计入总数
return count
javascript
/**
* @param {number[][]} nums
* @return {number}
*/
var numberOfPoints = function(nums) {
const diff = Array(102).fill(0);
for (let [start, end] of nums) {
diff[start] += 1;
diff[end + 1] -= 1;
}
let cover = 0;
let count = 0;
for (let i = 0; i < 102; i++) {
cover += diff[i];
if (cover > 0) {
count ++;
}
}
return count;
};
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)