LeetCode //C - 436. Find Right Interval

436. Find Right Interval

You are given an array of 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] and each starti is unique.

The right interval for an interval i is an interval j such that s t a r t j > = e n d i start_j >= end_i startj>=endi and startj is minimized. Note that i may equal j.

Return an array of right interval indices for each interval i. If no right interval exists for interval i, then put -1 at index i.

Example 1:

Input: intervals = [[1,2]]
Output: [-1]
Explanation: There is only one interval in the collection, so it outputs -1.

Example 2:

Input: intervals = [[3,4],[2,3],[1,2]]
Output: [-1,0,1]
Explanation: There is no right interval for [3,4].

The right interval for [2,3] is [3,4] since start0 = 3 is the smallest start that is >= end1 = 3.

The right interval for [1,2] is [2,3] since start1 = 2 is the smallest start that is >= end2 = 2.

Example 3:

Input: intervals = [[1,4],[2,3],[3,4]]
Output: [-1,2,-1]
Explanation: There is no right interval for [1,4] and [3,4].

The right interval for [2,3] is [3,4] since start2 = 3 is the smallest start that is >= end1 = 3.

Constraints:
  • 1 < = i n t e r v a l s . l e n g t h < = 2 ∗ 1 0 4 1 <= intervals.length <= 2 * 10^4 1<=intervals.length<=2∗104
  • intervals[i].length == 2
  • − 1 0 6 < = s t a r t i < = e n d i < = 1 0 6 -10^6 <= starti <= endi <= 10^6 −106<=starti<=endi<=106
  • The start point of each interval is unique.

From: LeetCode

Link: 436. Find Right Interval


Solution:

Ideas:
  1. Create an array to store the original indices of the intervals since we'll sort the intervals based on their start times but still need to return the indices based on the original input order.
  2. Sort the intervals based on their start times while keeping track of their original indices.
  3. For each interval, use binary search to find the smallest interval whose start time is greater than or equal to the current interval's end time.
  4. Populate the result array with the indices found in step 3. If no such interval is found, put -1 for that interval.
  5. Return the result array.
Code:
c 复制代码
int compare(const void* a, const void* b) {
    int* intervalA = *(int**)a;
    int* intervalB = *(int**)b;
    return intervalA[0] - intervalB[0];
}

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findRightInterval(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize) {
    // Create an array to store the original index of each interval
    int** intervalsWithIndex = (int**)malloc(intervalsSize * sizeof(int*));
    for (int i = 0; i < intervalsSize; i++) {
        intervalsWithIndex[i] = (int*)malloc(3 * sizeof(int)); // Increase size to store original index
        intervalsWithIndex[i][0] = intervals[i][0]; // start
        intervalsWithIndex[i][1] = intervals[i][1]; // end
        intervalsWithIndex[i][2] = i; // original index
    }
    
    // Sort the intervals by their start time
    qsort(intervalsWithIndex, intervalsSize, sizeof(int*), compare);
    
    // Allocate memory for the result array
    *returnSize = intervalsSize;
    int* result = (int*)malloc(intervalsSize * sizeof(int));
    
    // Binary search to find the right interval for each interval
    for (int i = 0; i < intervalsSize; i++) {
        int left = 0, right = intervalsSize - 1;
        int target = intervals[i][1];
        int found = -1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (intervalsWithIndex[mid][0] >= target) {
                found = intervalsWithIndex[mid][2];
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        result[i] = found;
    }
    
    // Free the allocated memory
    for (int i = 0; i < intervalsSize; i++) {
        free(intervalsWithIndex[i]);
    }
    free(intervalsWithIndex);
    
    return result;
}
相关推荐
吃着火锅x唱着歌1 天前
LeetCode 面试题 16.24.数对和
算法·leetcode·职场和发展
不会编程的小寒1 天前
数据结构 2.0
数据结构·算法
专注VB编程开发20年1 天前
图片转矢量图(提取轮廓线条)Potrace:一个基于多边形的位图轮廓矢量化算法(translation)
算法·图片转矢量
Dream it possible!1 天前
LeetCode 面试经典 150_二叉树层次遍历_二叉树的层平均值(82_637_C++_简单)
c++·leetcode·面试·二叉树
小羊失眠啦.1 天前
Rust核心库(core)深度解析:无依赖基石的设计与实践
数据库·算法·rust
Wenhao.1 天前
LeetCode Hot100 每日温度
数据结构·算法·leetcode·golang
吃着火锅x唱着歌1 天前
LeetCode 1679.K和数对的最大数目
算法·leetcode·职场和发展
im_AMBER1 天前
Leetcode 57
笔记·学习·算法·leetcode
im_AMBER1 天前
Leetcode 58 | 附:滑动窗口题单
笔记·学习·算法·leetcode
sin_hielo1 天前
leetcode 2154
算法·leetcode