leetcode update

This commit is contained in:
gameloader 2024-10-12 10:18:10 +08:00
parent 5983ce39b3
commit b281534992

View File

@ -15330,3 +15330,80 @@ public:
}; };
``` ```
## day228 2024-10-12
### 2406. Divide Intervals Into Minimum Number of Groups
You are given a 2D integer array intervals where intervals[i] = [lefti, righti] represents the inclusive interval [lefti, righti].
You have to divide the intervals into one or more groups such that each interval is in exactly one group, and no two intervals that are in the same group intersect each other.
Return the minimum number of groups you need to make.
Two intervals intersect if there is at least one common number between them. For example, the intervals [1, 5] and [5, 8] intersect.
![1012OJNNFVflIZH0](https://testingcf.jsdelivr.net/gh/game-loader/picbase@master/uPic/1012OJNNFVflIZH0.png)
### 题解
本题先将intervals数组按left排序排序的好处在于无序的数组遍历时信息过于丰富使得我们无法确定一些性质而排序后信息含量减少更方便我们确定一些关系。直观来说排序后left是有序的因此我们不需要再考虑left和left之间的关系只需考虑right以及left和right之间的关系。
其实信息量多还是少的定义是有一点反直觉的,比如一个乱序的句子和一个正常的通顺句子,哪个句子中的信息含量更高呢,其实是乱序的句子。因为乱序的句子其表达的意义有更多的可能性,这就意味着句子中每个单词都包含更丰富的信息。而通顺的句子其句子含义基本是可以确定的,去掉一两个字甚至也不影响我们理解句子的含义,这也意味着句子中有些字的包含的信息其实非常少。再比如文言文会比白话文难懂,正是因为文言文遣词造句更加精简,使得每个句子中包含的信息相对于白话文大大增加了,因此我们可能一下子很难理解这么多的信息,这就是“难懂”。
我之前一直默认有序包含了更多的“信息”,常常说排序是让我们有了更多可利用的信息,但从信息论的角度看,其实排序是让这个系统的信息更少,减少了干扰信息,从而使得我们可以更好的把握它的性质。这样看来我之前的说法其实是错误的,因此有必要在此纠正。
回到本题在left有序后只需考虑left和right之间的关系遍历数组时将right保存起来如果我们想将下一个interval和当前已经在某个组中的interval放在同一组中则下一个interval的left应该大于当前某个组中最大的right。如果有多个组的最大right都符合条件我们就应该使用贪心的思路将该interval放入所有组中right最小的组内。由此我们只需要知道当前所有组中最小的right是多少与下一个interval的left比较如果left>right则放入该组并更新该组的right否则创建一个新的组将这个interval单独放入一个组中。由于只需要最小的right可以利用最小堆将所有组的right都放入最小堆每次返回堆顶即可
### 代码
```cpp
class MinHeap {
private:
std::priority_queue<int, std::vector<int>, std::greater<int>> pq;
public:
void insert(int value) {
pq.push(value);
}
int extractMin() {
int minValue = pq.top();
pq.pop();
return minValue;
}
int peekMin() const {
return pq.top();
}
bool isEmpty() const {
return pq.empty();
}
int size() const {
return pq.size();
}
};
class Solution {
public:
int minGroups(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end());
int groups = 0;
MinHeap minheap;
minheap.insert(intervals[0][1]);
groups++;
for (int i=1;i<intervals.size();i++){
int maxright = minheap.peekMin();
if (intervals[i][0] > maxright){
maxright = minheap.extractMin();
minheap.insert(intervals[i][1]);
}else{
minheap.insert(intervals[i][1]);
groups++;
}
}
return groups;
}
};
```