当前位置: 首页 > article >正文

力扣(leetcode)每日一题 2848 与车相交的点

2848. 与车相交的点 - 力扣(LeetCode)

题干

给你一个下标从 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 。

提示:

1 <= nums.length <= 100
nums[i].length == 2
1 <= starti <= endi <= 100

解法1

    public static int numberOfPoints(List<List<Integer>> nums) {
        TreeMap<Integer, Integer> map = new TreeMap<>();
        // 先进行排序  如果有线段1,10和1,5 在map中保证存放的是1,10这个数值更大的
        for (int i = 0; i < nums.size(); i++) {
            List<Integer> integers = nums.get(i);
            Integer key = integers.get(0);
            Integer valueOrigin = integers.get(1);
            Integer value = map.get(key);
            if (value == null || value < valueOrigin) {
                map.put(key, valueOrigin);
            }
        }
        int count = 0;
        // 再进行遍历
        Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
        int max = 0; // 这里的max是最大结算点
        while (iterator.hasNext()) {
            Map.Entry<Integer, Integer> entry = iterator.next();
            Integer key = entry.getKey();
            Integer value = entry.getValue();
            if (key > max) {  // 如果max为3 这里的线段为4,8 直接刷记录然后更新max为8 
                count += value - key + 1;
                max = value;
            }
            if (key <= max && value > max) { // 这里max为6    线段为4,8   需要更新的点是7到8 因为max已经结算过了,所以这里不需要加1
                count += value - max;
                max = value;
            }
        }
        return count;
    }

在这里插入图片描述

复杂度应该是n * logN + n 这里和数值无关

题解的复杂度是n+c c是元素的范围
下意识觉得元素的范围会很大是10的9次方级别。

解法2

讲一下题解的第二种做法

一个数组上,从左边到右边,如果有线段开始,count就加上1,如果有线段结束,count就减去1
这样count大于1 的位置上就肯定是有线段覆盖的。

 public static int numberOfPoints(List<List<Integer>> nums) {
        int[] arr = new int[102];
        for (List<Integer> num : nums) {
            arr[num.get(0)]++; // 获取count,
            arr[num.get(1) + 1]--; // 归还count
        }
        int count = 0;
        int res = 0;
        for (int i : arr) {
            count += i;
            if (count > 0) {
                res++;
            }
        }
        return res;
    }

在这里插入图片描述

总结

一般的范围和数值不会给这么小,这纯摆着送分


http://www.kler.cn/a/308562.html

相关文章:

  • 十三、注解配置SpringMVC
  • 深入理解接口测试:实用指南与最佳实践5.0(一)
  • 24/11/12 算法笔记<强化学习> Policy Gradient策略梯度
  • AI 扩展开发者思维方式:以 SQL 查询优化为例
  • 去地面算法——depth_clustering算法调试(1)
  • LeetCode【0014】最长公共前缀
  • 7天速成前端 ------学习日志 (继苍穹外卖之后)
  • Spire.PDF for .NET【页面设置】演示:为 PDF 添加背景颜色或背景图像
  • python压缩图片的代码
  • 《锐捷AP 胖模式配置示例》
  • UiBot教程:实现复杂流程图的高效方法
  • C++学习笔记(21)
  • solidity-21-call_contract
  • 华为SMU02B1智能通信电源监控单元模块简介
  • 基于SpringBoot+Vue的养老院管理系统
  • 在Ubuntu中编译含有JSON的文件出现报错
  • 【前后端】大文件切片上传
  • 网络安全学习(一)初识kali
  • 【JavaEE初阶】多线程(5 单例模式 \ 阻塞队列)
  • 构建基于 Feign 的微服务:从 Eureka 到负载均衡的实践 --day05
  • 微信支付开发-前端api实现
  • 大模型笔记03--快速体验dify
  • HTTP的强制缓存和协商缓存有什么区别和联系?
  • 《使用 LangChain 进行大模型应用开发》学习笔记(三)
  • 行人动作行为识别系统源码分享
  • LLamaindex基本使用