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;
}
相关推荐
我星期八休息15 分钟前
深入理解跳表(Skip List):原理、实现与应用
开发语言·数据结构·人工智能·python·算法·list
lingran__15 分钟前
速通ACM省铜第四天 赋源码(G-C-D, Unlucky!)
c++·算法
haogexiaole43 分钟前
贪心算法python
算法·贪心算法
希望20171 小时前
图论基础知识
算法·图论
m0_713541841 小时前
systemverilog如何解决不能使用变量索引来进行位选择的范围指定
算法·systemverilog
七牛云行业应用1 小时前
深度解析强化学习(RL):原理、算法与金融应用
人工智能·算法·金融
和编程干到底2 小时前
数据结构 栈和队列、树
数据结构·算法
纪元A梦2 小时前
贪心算法在GNN邻域采样问题中的深度解析
算法·贪心算法
宇钶宇夕2 小时前
西门子 S7-200 SMART PLC 核心指令详解:从移位、上升沿和比较指令到流水灯控制程序实战
运维·算法·自动化
小莞尔2 小时前
【51单片机】【protues仿真】基于51单片机数控直流稳压电源系统
c语言·stm32·单片机·嵌入式硬件·51单片机