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;
}
相关推荐
米粒134 分钟前
力扣算法刷题 Day 31 (贪心总结)
算法·leetcode·职场和发展
少许极端38 分钟前
算法奇妙屋(四十)-贪心算法学习之路7
java·学习·算法·贪心算法
AlenTech1 小时前
647. 回文子串 - 力扣(LeetCode)
算法·leetcode·职场和发展
RFCEO1 小时前
C语言逆向学习基础课 第1课:数组越界与指针操作基础陷阱
c语言·解引用校验·safe_free宏·悬空指针
py有趣1 小时前
力扣热门100题之合并两个有序链表
算法·leetcode·链表
8Qi81 小时前
LeetCode热题100--45.跳跃游戏 II
java·算法·leetcode·贪心算法·编程
foundbug9992 小时前
基于STM32的步进电机加减速程序设计(梯形加减速算法)
stm32·单片机·算法
北顾笙9802 小时前
day12-数据结构力扣
数据结构·算法·leetcode
凌波粒2 小时前
LeetCode--454.四数相加 II(哈希表)
算法·leetcode·散列表
漫随流水2 小时前
c++编程:D进制的A+B(1022-PAT乙级)
数据结构·c++·算法