从零学算法2848

2848 .给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i,numsi = 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 。

  • 我的原始人解法:直接遍历每个区间,加到 set,最后返回 set 的长度
java 复制代码
  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,所以只有一种情况。此时无法合并
  • 那么,如果我们对 nums 根据区间起点进行排序,使得遍历 nums 时保证 3<=a 就只剩下了三种情况。我们先构造一个区间,然后遍历区间时如果能合并区间就合并,如果不能那么我们就计算当前区间包含几个点,然后更新成新的区间即可。
java 复制代码
  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;
  }
相关推荐
nhdh29 分钟前
B+树揭秘:MySQL索引核心原理全解析
数据结构·b树·mysql
海上小飞龙43 分钟前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂1 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i1 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
乐迪信息2 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
Sirens.3 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕4 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng4 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆5 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的6 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣