题目描述
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),请你判断一个人是否能够参加这里面的全部会议。
示例 1:
输入: [[0,30],[5,10],[15,20]]
输出: false
示例 2:
输入: [[7,10],[2,4]]
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/meeting-rooms
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
白话题目:
![](https://img-service.csdnimg.cn/img_convert/358801d942529129907a3cb9bca015a6.png)
说得很明白,就是给了一堆两个“数对”,里面不能交叉呗,如果交叉时间就不能重合了。
虽然说是简单题,我看起来一点也笑不起来,怎么处理?怎么存的啊?
算法:
要不是leetcode给了一个二维的整型数组的输入我是真不知道怎么存啊。
我给你画个图
这个就是三行2列的,所有的都是n行2列的,现在明白了吧
(1)二维数组快排
还记得简单的模板不
int cmp_int(const void* _a , const void* _b) //参数格式固定
{
int* a = (int*)_a; //强制类型转换
int* b = (int*)_b;
return *a - *b;
}
二维整型数组的看这个,强转-->取地址->看内容
int cmp(const void *a, const void *b)
{
int *tmpA = *(int **)a;
int *tmpB = *(int **)b;
return *(int *)tmpA - *(int *)tmpB;
}
(2)之后比较两个位置就好,哪两个?
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int cmp(const void *a, const void *b)
{
int *tmpA = *(int **)a;
int *tmpB = *(int **)b;
return *(int *)tmpA - *(int *)tmpB;
}
bool canAttendMeetings(int** intervals, int intervalsSize, int* intervalsColSize)
{
int i;
if ((intervals == NULL) || (intervalsSize == 0))
{
return true;
}
if (intervalsSize == 1)
{
return true;
}
qsort(intervals, intervalsSize, sizeof(intervals[0]), cmp);
for (i = 0; i < intervalsSize - 1; i++)
{
if (intervals[i][1] > intervals[i + 1][0])
{
return false;
}
}
return true;
}
int main()
{
int intervalsSize;//m
int intervalsColSize;//n
printf("输入m*n大小,例如 (3 2)");
scanf("%d %d",&intervalsSize,&intervalsColSize);
printf("输入矩阵,例如 (0 30 5 10 15 20)\n");
int** intervals=(int**)malloc(sizeof(int*)*intervalsSize);
int m,n;
for ( m = 0; m < intervalsSize; m ++)
{
intervals[m]=(int*)malloc(sizeof(int)*intervalsColSize);
for ( n = 0; n< intervalsColSize; n ++)
{
scanf("%d",&intervals[m][n]);
}
}
int result=canAttendMeetings(intervals, intervalsSize, &intervalsColSize);
printf("%d\n",result);
return 0;
}