• 从零学算法2848


    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 。

    • 我的原始人解法:直接遍历每个区间,加到 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();
        }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    • 他人解法:比较两个区间,根据能否合并区间划分,你会发现总共只有 6 种可能。设区间 1 两端为 3,5,区间 2 两端为 a,b:
      • a < 3 时有三种情况,比如 a 为 2
        • b < 3,35
      • 3<=a<=5 时有两种情况,比如 a 为 4
        • b<=5(合并后仍为 3-5),b>5(合并后为 3-b)
      • a>5 时那 b 不用说了也大于 5,所以只有一种情况。此时无法合并
    • 那么,如果我们对 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;
        }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
  • 相关阅读:
    Java期末大作业补救基地~ 谁还不会点JDBC?【Java Swing 和 Mysql】历时三天三夜的代码&&直接白拿
    Zookeeper系统模型_客户端命令行
    【QT】QT 按钮保持按下时的样式
    记录一次解决数据库连接池连接泄露BUG
    Word控件Spire.Doc 【文本】教程(20) ;如何在 C#、VB.NET 下检索 Word 中所有 TextRanges 的样式名称
    自己写了一个CM管理GBase数据库集群
    怎么利用互联网赚钱,网上赚钱的7种方法
    elmentui表单重置初始值问题与解决方法
    LinkedHashMap源码解析
    选择合适的软件管理视频制作排期
  • 原文地址:https://blog.csdn.net/m0_53256503/article/details/132810497