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

力扣题解2848

大家好,欢迎来到无限大的频道。

今日继续给大家带来力扣题解。

题目描述(简单):

与车相交的点

给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i,nums[i] = [starti, endi] ,其中 starti 是第 i 辆车的起点,endi 是第 i 辆车的终点。

返回数轴上被车 任意部分 覆盖的整数点的数目。

解题思路:

这道问题抽象就抽象在,读不懂题目要求干啥,也不明白举例是什么意思,得先把题目看懂。(我来中译中一下)

这个问题可以理解为在数轴上有多辆车,每辆车的停车区域用一个区间来表示,例如 nums[i] = [starti, endi] 表示第 i 辆车的起点为 starti,终点为 endi。我们需要计算在数轴上这些车的停车区域重叠部分所覆盖的整数点的总数。

具体来说,我们需要求出所有车辆停车区间内的整数点的总和,即使得某一点被多辆车的区间覆盖也只算一次。

示例说明:

假设车辆的区间如下:

  • 车1: [1, 3]

  • 车2: [2, 5]

  • 车3: [4, 6]

那么这些车辆覆盖的区间为:

  • 车1覆盖的整数点为 {1, 2, 3}

  • 车2覆盖的整数点为 {2, 3, 4, 5}

  • 车3覆盖的整数点为 {4, 5, 6}

所有被覆盖的整数点为 {1, 2, 3, 4, 5, 6},所以被覆盖的整数点总数为 6。

算法思路

  1. 合并区间:首先对所有区间进行合并,去掉重叠部分。

  2. 计算被覆盖的点:在合并之后计算每个区间中整数点的数量,即为 end - start + 1 的总和。

3.采用排序加贪心策略

参考代码:

// 定义一个结构体来表示区间
typedef struct {int start;int end;
} Interval;
​
// 比较函数用于排序
int compare(const void *a, const void *b) {Interval *intervalA = (Interval *)a;Interval *intervalB = (Interval *)b;return intervalA->start - intervalB->start;
}
​
int numberOfPoints(int** nums, int numsSize, int* numsColSize) {if (numsSize == 0) return 0;
​// 1. 创建一个 Interval 数组Interval* intervals = (Interval*)malloc(numsSize * sizeof(Interval));
​// 2. 将 nums 转换为 Interval 数组for (int i = 0; i < numsSize; i++) {intervals[i].start = nums[i][0];intervals[i].end = nums[i][1];}
​// 3. 排序区间qsort(intervals, numsSize, sizeof(Interval), compare);
​int totalPoints = 0;int currStart = intervals[0].start;int currEnd = intervals[0].end;
​// 4. 合并区间并计算覆盖的点for (int i = 1; i < numsSize; i++) {if (intervals[i].start <= currEnd) { // 如果有重叠// 扩大当前区间的结束点if (intervals[i].end > currEnd) {currEnd = intervals[i].end;}} else { // 如果没有重叠,计算当前区间的点数totalPoints += currEnd - currStart + 1;currStart = intervals[i].start;currEnd = intervals[i].end;}}
​// 添加最后一个区间的覆盖点totalPoints += currEnd - currStart + 1;
​// 释放内存free(intervals);
​return totalPoints;
}
​

时间复杂度:

1. 创建 Interval 数组:

   创建 Interval 数组的时间复杂度是 O(n),其中 n是输入的区间数量 `numsSize`。

2. 将 nums 转换为 Interval 数组:

   遍历所有区间并将其转换为 Interval 的时间复杂度同样是 O(n)。

3. 排序区间:

   使用 `qsort` 进行排序,排序的时间复杂度是 O(n log n)。

4. 合并区间并计算覆盖的点:

   遍历排好序的区间以合并并计算覆盖点的时间复杂度是 O(n)。

综上所述,主要的时间开销在于排序,因此整个 `numberOfPoints` 函数的时间复杂度为:

[O(n log n)]

 空间复杂度:

1. 存储 Interval 数组:

   创建存储 Interval 的数组需要 O(n)的额外空间。

2. 其他空间:

   在函数中使用的变量、指针等只占用常数空间 O(1),不随 n 的变化而变化。

因此,整个函数的空间复杂度主要依赖于存储 Interval 数组的开销,为:

[O(n)]

总结:

时间复杂度:(O(n log n))

空间复杂度:(O(n))​

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C语言】分支和循环(下)
  • C语言指针和数组梳理
  • opencv之图像轮廓(三)--凸包
  • Unity SRP 可编程渲染管线的基本用法
  • Python——俄罗斯方块
  • 『功能项目』切换职业面板【48】
  • 笔试强训day13
  • MySQL索引-聚簇索引和非聚簇索引
  • Android 11 FileProvider的使用和限制
  • URL的执行流程
  • 【C-项目】网盘(一期,线程池版)
  • react 安装使用 antd+国际化+定制化主题+样式兼容
  • 进程vs线程:高效并发编程的基石
  • fsck 命令:修复文件系统错误
  • AI时代的到来,让英文写作变得简单
  • @jsonView过滤属性
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 2019.2.20 c++ 知识梳理
  • AWS实战 - 利用IAM对S3做访问控制
  • C++类的相互关联
  • C++入门教程(10):for 语句
  • CODING 缺陷管理功能正式开始公测
  • CSS 提示工具(Tooltip)
  • FastReport在线报表设计器工作原理
  • iOS小技巧之UIImagePickerController实现头像选择
  • isset在php5.6-和php7.0+的一些差异
  • JAVA 学习IO流
  • Java新版本的开发已正式进入轨道,版本号18.3
  • miaov-React 最佳入门
  • Next.js之基础概念(二)
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Sublime text 3 3103 注册码
  • text-decoration与color属性
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 初识 webpack
  • 日剧·日综资源集合(建议收藏)
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 突破自己的技术思维
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 在weex里面使用chart图表
  • 怎么把视频里的音乐提取出来
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • postgresql行列转换函数
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (007)XHTML文档之标题——h1~h6
  • (20050108)又读《平凡的世界》
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (黑马C++)L06 重载与继承
  • (算法设计与分析)第一章算法概述-习题
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)Unity3DUnity3D在android下调试
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • . ./ bash dash source 这五种执行shell脚本方式 区别