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 。
public int numberOfPoints(List<List<Integer>> nums) {
Set<Integer> set = new HashSet<>();
for(List<Integer> l : nums){
for(int i=l.get(0);i<=l.get(1);i++){
set.add(i);
}
}
return set.size();
}
public int numberOfPoints(List<List<Integer>> nums) {
// 排序
Collections.sort(nums,(l1,l2)->l1.get(0)-l2.get(0));
int start=0,end=0,ans=0;
for(List<Integer> l:nums){
// 分析中 3<=a<=5 的情况
if(l.get(0)<=end){
// 更新区间末端
if(l.get(1)>end){
end=l.get(1);
}else{
// 否则区间 2 属于区间 1,就什么也不用改,这个 else 可以直接省略掉
continue;
}
}else{
// 最开始肯定是直接进这个部分更新区间的,此时不该计算区间长度
// 否则等于 ans 初始就为 0-0+1=1 了
// 之后再进来就是直接结算完当前区间然后更新为新的区间了
ans+=end==0?0:end-start+1;
start=l.get(0);
end=l.get(1);
}
}
ans+=end-start+1;
return ans;
}