436. Find Right Interval

Problem statement:

Given a set of intervals, for each of the interval i, check if there exists an interval j whose start point is bigger than or equal to the end point of the interval i, which can be called that j is on the "right" of i.

For any interval i, you need to store the minimum interval j‘s index, which means that the interval j has the minimum start point to build the "right" relationship for interval i. If the interval j doesn‘t exist, store -1 for the interval i. Finally, you need output the stored value of each interval as an array.

Note:

  1. You may assume the interval‘s end point is always bigger than its start point.
  2. You may assume none of these intervals have the same start point.

Example 1:

Input: [ [1,2] ]

Output: [-1]

Explanation: There is only one interval in the collection, so it outputs -1.

Example 2:

Input: [ [3,4], [2,3], [1,2] ]

Output: [-1, 0, 1]

Explanation: There is no satisfied "right" interval for [3,4].
For [2,3], the interval [3,4] has minimum-"right" start point;
For [1,2], the interval [2,3] has minimum-"right" start point.

Example 3:

Input: [ [1,4], [2,3], [3,4] ]

Output: [-1, 2, -1]

Explanation: There is no satisfied "right" interval for [1,4] and [3,4].
For [2,3], the interval [3,4] has minimum-"right" start point.

Solution:

This is a binary search question, have not solved this problem for a long time. Brute force is a solution. Time complexity is O(n * n). Obviously, it can not pass OJ.

My idea is as follows:

(1) Put all start values into an array, and put the start point into a hash table to get the index after we find the rightmost value

(2) Sort the start point in ascending order.

(3) Binary search to find the right index of the start array. return -1 if can not find the rightmost interval.

  • Compare with easy binary search, the qualification return condition of this search is an interval.
  • We need to compare two values: mid and mid + 1. Since mid = (left + right) / 2, mid + 1 will not exceed the limitation of array.
  • There are four test branches in binary check.
  • Three situations for the return value.

(4) Return the value

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    vector<int> findRightInterval(vector<Interval>& intervals) {
        int size = intervals.size();
        unordered_map<int, int> table;
        vector<int> start_arr;
        for(int i = 0; i < size; i++){
            start_arr.push_back(intervals[i].start);
            table[intervals[i].start] = i;
        }
        sort(start_arr.begin(), start_arr.end());
        vector<int> right_idx(size, -1);
        for(int i = 0; i < size; i++){
            int idx = find_idx(start_arr, intervals[i].end);
            if(idx != -1){
                right_idx[i] = table[start_arr[idx]];
            }
        }
        return right_idx;
    }

private:
    int find_idx(vector<int>& start_arr, int val){
        int left = 0;
        int right = start_arr.size() - 1;
        while(left + 1 < right){
            int mid = left + (right - left) / 2;
            if(start_arr[mid] == val){
                return mid;
            }if(start_arr[mid] < val && start_arr[mid + 1] >= val){
                // most right solution
                return mid + 1;
            } else if (start_arr[mid] > val){
                right = mid;
            } else if(start_arr[mid + 1] < val){
                left = mid;
            }
        }
        // three situations when binary search ends
        if(start_arr[left] >= val){
            return left;
        } else if(start_arr[right] < val){
            return -1;
        } else {
            return right;
        }
    }
};
时间: 2024-11-25 13:37:47

436. Find Right Interval的相关文章

LeetCode 436. Find Right Interval

436. Find Right Interval Description Submission Solutions Add to List Total Accepted: 7209 Total Submissions: 17507 Difficulty: Medium Contributors: love_FDU_llp Given a set of intervals, for each of the interval i, check if there exists an interval

过中等难度题目.0310

  .   8  String to Integer (atoi)    13.9% Medium   . 151 Reverse Words in a String      15.7% Medium     . 288 Unique Word Abbreviation      15.8% Medium     . 29 Divide Two Integers      16.0% Medium     . 166 Fraction to Recurring Decimal      17.

继续过中等难度.0309

  .   8  String to Integer (atoi)    13.9% Medium   . 151 Reverse Words in a String      15.7% Medium     . 288 Unique Word Abbreviation      15.8% Medium     . 29 Divide Two Integers      16.0% Medium     . 166 Fraction to Recurring Decimal      17.

LeetCode Problems List 题目汇总

No. Title Level Rate 1 Two Sum Medium 17.70% 2 Add Two Numbers Medium 21.10% 3 Longest Substring Without Repeating Characters Medium 20.60% 4 Median of Two Sorted Arrays Hard 17.40% 5 Longest Palindromic Substring Medium 20.70% 6 ZigZag Conversion Ea

JsSIP.UA.JsSIP 总是返回错误:422 Session Interval Too Small

在JsSIP 中 JsSIP.UA.call 总是 返回错误:422 Session Interval Too Small 关于错详情在这篇文章中解释的比较详尽:http://www.cnblogs.com/yoyotl/p/4980817.html 但是没有JsSIP的解决方法 具体的解决方法如下: JsSIP.js中的搜索 SESSION_EXPIRES: 把这个参数改大,  大于120就行了, (要是还不行,就继续加大吧^.^) SESSION_EXPIRES: 90 加大: SESSIO

LeetCode Insert Interval

原题链接在这里:https://leetcode.com/problems/insert-interval/ AC Java: 1 /** 2 * Definition for an interval. 3 * public class Interval { 4 * int start; 5 * int end; 6 * Interval() { start = 0; end = 0; } 7 * Interval(int s, int e) { start = s; end = e; } 8

AngularJS中$timeout和$interval的用法详解

1. 先将$interval,$timeout,作为参数注入到controller中,例如rds.controller('controllerCtrl', ['app', '$scope','$http','$routeParams','$filter','$location','$interval','$timeout', function (app, $scope,$http,$routeParams,$filter,$location,$interval,$timeout) {2.在需要用

LeetCode57 Insert Interval

题目: Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). You may assume that the intervals were initially sorted according to their start times. Example 1:Given intervals [1,3],[6,9], insert and mer

[LeetCode]题解(python):057-Insert Interval

题目来源 https://leetcode.com/problems/insert-interval/ Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). You may assume that the intervals were initially sorted according to their start times. Examp