• 每日一题·729.我的日程安排表


    题目

    实现一个 MyCalendar 类来存放你的日程安排。如果要添加的日程安排不会造成 重复预订 ,则可以存储这个新的日程安排。

    当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生 重复预订 。

    日程可以用一对整数 start 和 end 表示,这里的时间是半开区间,即 [start, end), 实数 x 的范围为,  start <= x < end 。

    实现 MyCalendar 类:

    MyCalendar() 初始化日历对象。
    boolean book(int start, int end) 如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true 。否则,返回 false 并且不要将该日程安排添加到日历中。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/my-calendar-i
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    示例

     

    思路

    线段树要解决的问题是: 在一个实时更新的动态数组中查询区间和(或广义的区间状态,如区间积,区间最大最小值).

    若所查询的数组为静态数组,则此问题只需要使用数组前缀和即能解决.

    本题需要对数组进行查询与存入可以使用线段树,但是对于线段树不熟悉的也可以用数组替换线段树

    定义两个数组空间,分别保存左区间节点和右区间,进一步优化设置两个变量,保存左区间最小值和右区间最大值,当区间左节点大于最大值或者区间右节点小于最小值时,区间肯定不会在数组空间中重复,所以存入数组空间并更新最大最小值

    当区间左右节点在最值里面时,遍历数组空间,寻找区间是否与其他空间有重合地方,没有存入,有就退出,不需要更新最值,因为是在最值里面的

    存入一个数据就对数组空间进行升序处理,保证数组空间的连续性

    代码

    1. typedef struct {
    2. int * startNums;
    3. int * endNums;
    4. int min;
    5. int max;
    6. int inode;
    7. } MyCalendar;
    8. MyCalendar* myCalendarCreate() {
    9. MyCalendar * obj = malloc(sizeof(MyCalendar) * 1);
    10. obj->startNums = malloc(sizeof(int) * 1000);
    11. obj->endNums = malloc(sizeof(int) * 1000);
    12. obj->min = INT_MAX;
    13. obj->max = INT_MIN;
    14. obj->inode = 0;
    15. return obj;
    16. }
    17. #define MAX(a , b) ((a) > (b) ? (a) : (b))
    18. #define MIX(a , b) ((a) < (b) ? (a) : (b))
    19. int cmp(const void * a, const void * b)
    20. {
    21. return *(int *)a - *(int *)b;
    22. }
    23. bool myCalendarBook(MyCalendar* obj, int start, int end) {
    24. if(start >= obj->max || end <= obj->min)//第一种情况,区间边界大于或者小于最值
    25. {
    26. obj->max = MAX(obj->max , end);
    27. obj->min = MIX(obj->min , start);
    28. obj->startNums[obj->inode] = start;
    29. obj->endNums[obj->inode] = end;
    30. obj->inode++;
    31. qsort(obj->startNums, obj->inode, sizeof(obj->startNums[0]), cmp);
    32. qsort(obj->endNums, obj->inode, sizeof(obj->endNums[0]), cmp);
    33. return true;
    34. }
    35. for(int i = 0; i < obj->inode-1; i++)//第二种情况,遍历区间数组,寻找能否存入
    36. {
    37. if(start >= obj->endNums[i])
    38. {
    39. if(end <= obj->startNums[i+1])
    40. {
    41. obj->startNums[obj->inode] = start;
    42. obj->endNums[obj->inode] = end;
    43. obj->inode++;
    44. qsort(obj->startNums, obj->inode, sizeof(obj->startNums[0]), cmp);
    45. qsort(obj->endNums, obj->inode, sizeof(obj->endNums[0]), cmp);
    46. return true;
    47. }
    48. }
    49. else
    50. {
    51. return false;
    52. }
    53. }
    54. return false;
    55. }
    56. void myCalendarFree(MyCalendar* obj) {
    57. free(obj->startNums);
    58. free(obj->endNums);
    59. free(obj);
    60. }
    61. /**
    62. * Your MyCalendar struct will be instantiated and called as such:
    63. * MyCalendar* obj = myCalendarCreate();
    64. * bool param_1 = myCalendarBook(obj, start, end);
    65. * myCalendarFree(obj);
    66. */

    时间空间复杂度

     

  • 相关阅读:
    90%的面试官都会问到交换网络里面冗余和破环的STP协议
    HTTP原理入门
    【正点原子STM32连载】第五十三章 DSP测试实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
    mock的基本用法
    循环(while do...while for)介绍
    【.Net/C#之ChatGPT开发系列】四、ChatGPT多KEY动态轮询,自动删除无效KEY
    9.spark自适应查询-AQE之动态调整Join策略
    掌握JavaScript的练习之道:十个手写函数让你信手拈来!
    污损指纹恢复与识别
    【华为OD机试真题 python】补种未成活胡杨 【2022 Q4 | 100分】
  • 原文地址:https://blog.csdn.net/m0_64560763/article/details/125616809