力扣双周赛第57期(下)

247 阅读2分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

1942. 最小未被占据椅子的编号

截屏2021-08-12 下午11.01.46.png

思路分析

本题说明了所有到达的时间互不相同,那么可以当做一个模拟题来做,题干中说有无数椅子,我们可以当作有n个椅子。然后开始遍历模拟。发现题干中给出的朋友顺序并不是有序的(按理说应该给一个有序的,不过这也无所谓我们加一个sort就可以了。)

1943. 描述绘画结果

截屏2021-08-12 下午11.18.19.png

截屏2021-08-12 下午11.18.34.png

思路分析

我们可以尝试记录端点的方式得到结果,因为首先由于一个线段的颜色都是一样的,所以出现了改变的“新线段”一定是被其他线段割裂的,以示例1为例,我们即使将长度为5的改为长度为7,起点是-1,新出现的线段的起点是长度为9的线段的起点,终点是长度为“7”的终点。

那么基于这个知识点我们再想想如何记录端点,我们可以设置arr[起点]为color,而arr[终点]为-color。

遍历累加的时候,如果sum 和上一个区间的color相同,那么就相当于这个点在某个线段中间,如果不同,就会出现新线段。

然后就想不出来其他点了,这里看下解析了

 if (sum != 0) {
    // anw.empty() 还没有构造区间
    // 当前位置和最后一个已构造区间的累加和不同
    // 当前位置和最后一个已构造区间的不连续,中间有 0
    // 当前位置和最后一个已构造区间有线段变化
    // 根据题意,上述条件满足任意一个,就要构造一个新区间
    if (anw.empty() || sum != anw.back().at(2) || anw.back().at(1) != i || mark[i]) {
        anw.emplace_back(std::vector<long long>{i,i+1,sum});
    } else {
        anw.back().at(1)++;
    }
}