Home > Article > Backend Development > Find the index of the closest non-overlapping interval to the right of each given N interval
A standard interval representation usually consists of a set of paired starting and ending points. Finding the nearest non-overlapping interval to the right of each specified interval constitutes our current dilemma. This task is of huge importance in many different applications, such as resource allocation and scheduling, since it involves identifying the next interval that does not intersect or contain the current interval.
To help understand the code demonstration that is about to be shown, let's first look at the syntax that will be used, and then dive into the algorithm.
// Define the Interval structure struct Interval { int start; int end; }; // Function to find the index of closest non-overlapping interval vector<int> findClosestNonOverlappingInterval(const vector<interval>& intervals) { // Implementation goes here } </interval></int>
Solving this problem requires an organized approach, centered on iterating intervals in reverse order while maintaining an index stack pointing to their nearest non-overlapping partners. Here are the brief but effective steps of how our proposed algorithm solves this problem -
Create an empty stack to store the indices of non-overlapping intervals.
Initialize an index vector with a size equal to the number of intervals, padded with -1 to indicate that no non-overlapping intervals have been found.
Traverse the intervals from right to left.
If the stack is non-empty and there is a cross-sectional area between the current interval and the top interval, proceed to eliminate (pop) that top-most index from the stack.
李>To ensure accurate representation, if the stack is empty, the index position is assigned -1 in the vector representing the current interval. This means that there are no non-overlapping intervals on the right.
It is strongly recommended to ensure that the stack we specify has elements before attempting this task; otherwise an error will occur. After confirming that we have one or more elements on said structure, we can do this by having the vector of the current interval set its index value to the same as the corresponding element at the topmost position on the structure we identified and its corresponding index information. Include it in the same structure to perform operations.
Repeat steps 3-7 until all intervals have been processed.
Return the index vector.
To resolve this dilemma, we will look at two different strategies.
One possible strategy to solve this problem is to use violence. Essentially, this requires examining each individual interval and then comparing it to all intervals to the right of it until no intersection option becomes obvious. However. It is worth noting that utilizing this method results in a time complexity of O(N^2). Where N represents the total number of intervals participating in the inspection process.
vector<int> findClosestNonOverlappingInterval(const vector<Interval>& intervals) { vector<int> result(intervals.size(), -1); for (int i = 0; i < intervals.size(); i++) { for (int j = i + 1; j < intervals.size(); j++) { if (intervals[i].end < intervals[j].start) { result[i] = j; break; } } } return result; }The Chinese translation of
#include#include using namespace std; // Define the Interval structure struct Interval { int start; int end; }; vector<int> findClosestNonOverlappingInterval(const vector<Interval>& intervals) { vector<int> result(intervals.size(), -1); for (int i = 0; i < intervals.size(); i++) { for (int j = i + 1; j < intervals.size(); j++) { if (intervals[i].end < intervals[j].start) { result[i] = j; break; } } } return result; } int main() { // Define intervals vector intervals = {{1, 3}, {2, 4}, {5, 7}, {6, 9}, {8, 10}}; // Find the index of closest non-overlapping interval for each interval vector closestIndices = findClosestNonOverlappingInterval(intervals); // Print the results for (int i = 0; i < intervals.size(); i++) { cout << "Interval [" << intervals[i].start << ", " << intervals[i].end << "] "; if (closestIndices[i] != -1) { cout << "has closest non-overlapping interval at index " << closestIndices[i] << endl; } else { cout << "has no non-overlapping interval to the right" << endl; } } return 0; }
Interval [1, 3] has closest non-overlapping interval at index 2 Interval [2, 4] has closest non-overlapping interval at index 2 Interval [5, 7] has closest non-overlapping interval at index 4 Interval [6, 9] has no non-overlapping interval to the right Interval [8, 10] has no non-overlapping interval to the right
One very successful approach involves utilizing the stack as a means of monitoring recent non-overlapping intervals. The time complexity of this strategy is O(N) since our task only requires us to peruse the interval once.
vector<int> findClosestNonOverlappingInterval(const vector<Interval>& intervals) { vector<int> result(intervals.size(), -1); stack<int> st; for (int i = intervals.size() - 1; i >= 0; i--) { while (!st.empty() && intervals[i].end >= intervals[st.top()].start) { st.pop(); } if (!st.empty()) { result[i] = st.top(); } st.push(i); } return result; }The Chinese translation of
#include#include using namespace std; // Define the Interval structure struct Interval { int start; int end; }; vector<int> findClosestNonOverlappingInterval(const vector<Interval>& intervals) { vector<int> result(intervals.size(), -1); for (int i = 0; i < intervals.size(); i++) { for (int j = i + 1; j < intervals.size(); j++) { if (intervals[i].end < intervals[j].start) { result[i] = j; break; } } } return result; } int main() { // Define intervals vector intervals = {{1, 3}, {2, 4}, {5, 7}, {6, 9}, {8, 10}}; // Find the index of closest non-overlapping interval for each interval vector closestIndices = findClosestNonOverlappingInterval(intervals); // Print the results for (int i = 0; i < intervals.size(); i++) { cout << "Interval [" << intervals[i].start << ", " << intervals[i].end << "] "; if (closestIndices[i] != -1) { cout << "has closest non-overlapping interval at index " << closestIndices[i] << endl; } else { cout << "has no non-overlapping interval to the right" << endl; } } return 0; }
Interval [1, 3] has closest non-overlapping interval at index 2 Interval [2, 4] has closest non-overlapping interval at index 2 Interval [5, 7] has closest non-overlapping interval at index 4 Interval [6, 9] has no non-overlapping interval to the right Interval [8, 10] has no non-overlapping interval to the right
Our exploration goal is to find the best position in C of the closest non-overlapping interval index to the right of each given interval. First, we discuss syntactic complexity in depth, while proposing an algorithm and proposing two potential solutions. As part of our investigation, we show how our brute force approach and stack-based optimization approach work with successfully tested executable code. This method allows you to easily identify the closest non-overlapping intervals for any particular set.
The above is the detailed content of Find the index of the closest non-overlapping interval to the right of each given N interval. For more information, please follow other related articles on the PHP Chinese website!