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 。文章来源地址https://www.toymoban.com/news/detail-706794.html
- 我的原始人解法:直接遍历每个区间,加到 set,最后返回 set 的长度
-
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(); }
- 他人解法:比较两个区间,根据能否合并区间划分,你会发现总共只有 6 种可能。设区间 1 两端为 3,5,区间 2 两端为 a,b:
- a < 3 时有三种情况,比如 a 为 2
- b < 3,3<b<5,b>5
- 3<=a<=5 时有两种情况,比如 a 为 4
- b<=5(合并后仍为 3-5),b>5(合并后为 3-b)
- a>5 时那 b 不用说了也大于 5,所以只有一种情况。此时无法合并
- a < 3 时有三种情况,比如 a 为 2
- 那么,如果我们对 nums 根据区间起点进行排序,使得遍历 nums 时保证 3<=a 就只剩下了三种情况。我们先构造一个区间,然后遍历区间时如果能合并区间就合并,如果不能那么我们就计算当前区间包含几个点,然后更新成新的区间即可。
-
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; }
文章来源:https://www.toymoban.com/news/detail-706794.html
到了这里,关于从零学算法2848的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!