757. Set Intersection Size At Least Two
You are given a 2D integer array intervals where i n t e r v a l s [ i ] = [ s t a r t i , e n d i ] intervals[i] = [start_i, end_i] intervals[i]=[starti,endi] represents all the integers from s t a r t i start_i starti to e n d i end_i endi inclusively.
A containing set is an array nums where each interval from intervals has at least two integers in nums.
- For example, if intervals = [[1,3], [3,7], [8,9]], then [1,2,4,7,8,9] and [2,3,4,8,9] are containing sets.
Return the minimum possible size of a containing set.
Example 1:
Input: intervals = [[1,3],[3,7],[8,9]]
Output: 5
Explanation: let nums = [2, 3, 4, 8, 9].It can be shown that there cannot be any containing array of size 4.
Example 2:
Input: intervals = [[1,3],[1,4],[2,5],[3,5]]
Output: 3
Explanation: let nums = [2, 3, 4].It can be shown that there cannot be any containing array of size 2.
Example 3:
Input: intervals = [[1,2],[2,3],[2,4],[4,5]]
Output: 5
Explanation: let nums = [1, 2, 3, 4, 5].It can be shown that there cannot be any containing array of size 4.
Constraints:
- 1 <= intervals.length <= 3000
- intervals[i].length == 2
- 0 < = s t a r t i < e n d i < = 10 8 0 <= start_i < end_i <= 10^8 0<=starti<endi<=108
From: LeetCode
Link: 757. Set Intersection Size At Least Two
Solution:
Ideas:
-
Sort intervals by end point (ascending), then by start point (descending) when end points are equal
-
Track state using two variables: point1 and point2 (last two points added to our set)
-
Process each interval and check how many of our current points it contains:
- Contains 0 points (start > point2): Add 2 points at positions end-1 and end
- Contains 1 point (start > point1): Add 1 point at position end
- Contains 2+ points: Add 0 points
Code:
c
// Comparator function to sort intervals by end point
// If end points are equal, sort by start point in descending order
int compare(const void* a, const void* b) {
int* intervalA = *(int**)a;
int* intervalB = *(int**)b;
if (intervalA[1] != intervalB[1]) {
return intervalA[1] - intervalB[1]; // Sort by end point ascending
}
return intervalB[0] - intervalA[0]; // If end points equal, sort by start point descending
}
int intersectionSizeTwo(int** intervals, int intervalsSize, int* intervalsColSize) {
if (intervalsSize == 0) return 0;
// Sort intervals by end point
qsort(intervals, intervalsSize, sizeof(int*), compare);
int count = 0;
int point1 = INT_MIN; // Second to last point added
int point2 = INT_MIN; // Last point added
for (int i = 0; i < intervalsSize; i++) {
int start = intervals[i][0];
int end = intervals[i][1];
if (start > point2) {
// Current interval doesn't contain any of our points
// Add the two rightmost points of this interval
count += 2;
point1 = end - 1;
point2 = end;
} else if (start > point1) {
// Current interval contains only point2
// Add one more point (the rightmost one)
count += 1;
point1 = point2;
point2 = end;
}
// If start <= point1, then the interval contains both point1 and point2
// No need to add any points
}
return count;
}