刷题-leetcode:436. 寻找右区间

2020-02-13  本文已影响0人  marksman_e902

题目地址:https://leetcode-cn.com/problems/find-right-interval/

给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”。

对于任何区间,你需要存储的满足条件的区间 j 的最小索引,这意味着区间 j 有最小的起始点可以使其成为“右侧”区间。如果区间 j 不存在,则将区间 i 存储为 -1。最后,你需要输出一个值为存储的区间值的数组。

注意:

你可以假设区间的终点总是大于它的起始点。
你可以假定这些区间都不具有相同的起始点。
示例 1:

输入: [ [1,2] ]
输出: [-1]

解释:集合中只有一个区间,所以输出-1。
示例 2:

输入: [ [3,4], [2,3], [1,2] ]
输出: [-1, 0, 1]

解释:对于[3,4],没有满足条件的“右侧”区间。
对于[2,3],区间[3,4]具有最小的“右”起点;
对于[1,2],区间[2,3]具有最小的“右”起点。
示例 3:

输入: [ [1,4], [2,3], [3,4] ]
输出: [-1, 2, -1]

解释:对于区间[1,4]和[3,4],没有满足条件的“右侧”区间。
对于[2,3],区间[3,4]有最小的“右”起点。

编程思路

此题可以硬解,先遍历所有区间尾,对于每尾再遍历一次所有的头,找出最小的即可。我选择麻烦一点,先对区间们依据区间首进行升序排序,然后再从头依次遍历区间尾,从该区间起向后查找。

代码

class Solution {
public:
    vector<int> findRightInterval(vector<vector<int>>& intervals) {
        int size=intervals.size();
        vector<int> indexes;
        vector<int> results;
        for(int k=0;k<size;k++){
            indexes.push_back(k);
            results.push_back(k);
        }
        mergeSort(intervals,indexes,0,size-1);
        //binary search
        for(int k=0;k<size;k++){
            int target=intervals[indexes[k]][1];
            int low=k+1,high=size-1,mid;
            int result=-1;
            while(low<=high){
                 mid=(low+high)/2;
                if(target==intervals[indexes[mid]][0]){//found
                    result=indexes[mid];
                    break;
                }
                else if(target<intervals[indexes[mid]][0]){
                    result=indexes[mid];
                    high=mid-1;
                }
                else if(target>intervals[indexes[mid]][0]){
                    low=mid+1;
                }
            }
            results[indexes[k]]=result;
        }
        return results;
    }
    /*
    custom merge sort,modified units' index will be stored in inputIndex
    */
    void mergeSort(vector<vector<int>>& inputVec,vector<int> &inputIndex,int low,int high){
        if(low<high){
            int mid=(low+high)/2;
            mergeSort(inputVec,inputIndex,low,mid);//left part sort
            mergeSort(inputVec,inputIndex,mid+1,high);//right part sort
            innerMerge(inputVec,inputIndex,low,mid,high);//both left and right already sorted,now merge them into one piece.
        }
    }
    /*
    merge low ~ mid and mid+1 ~ high into one piece
    */
    void innerMerge(vector<vector<int>>& inputVec,vector<int> &inputIndex,int low,int mid,int high){
        int i,j,k;
        auto indexCopy=inputIndex;
        printf("%d ",low);
        for(i=low,j=mid+1,k=low;i<=mid&&j<=high;k++){//caution:k=low
            if(inputVec[indexCopy[i]][0]<inputVec[indexCopy[j]][0]){//left<right
                inputIndex[k]=indexCopy[i++];
                
            }
            else {//left>right
                inputIndex[k]=indexCopy[j++];
            }
        }
        
        while(i<=mid){
            inputIndex[k++]=indexCopy[i++];
            
        }
        while(j<=high){
            inputIndex[k++]=indexCopy[j++];
        }
    }
};

性能:

都不好意思贴出来了


image.png
上一篇 下一篇

猜你喜欢

热点阅读