给你一个区间数组
intervals
,其中intervals[i] = [starti, endi]
,且每个starti
都 不同 。区间
i
的 右侧区间 可以记作区间j
,并满足startj
>= endi
,且startj
最小化 。注意i
可能等于j
。返回一个由每个区间
i
的 右侧区间 在intervals
中对应下标组成的数组。如果某个区间i
不存在对应的 右侧区间 ,则下标i
处的值设为-1
。示例 1:
输入:intervals = [[1,2]] 输出:[-1] 解释:集合中只有一个区间,所以输出-1。示例 2:
输入:intervals = [[3,4],[2,3],[1,2]] 输出:[-1,0,1] 解释:对于 [3,4] ,没有满足条件的“右侧”区间。 对于 [2,3] ,区间[3,4]具有最小的“右”起点; 对于 [1,2] ,区间[2,3]具有最小的“右”起点。示例 3:
输入:intervals = [[1,4],[2,3],[3,4]] 输出:[-1,2,-1] 解释:对于区间 [1,4] 和 [3,4] ,没有满足条件的“右侧”区间。 对于 [2,3] ,区间 [3,4] 有最小的“右”起点。提示:
1 <= intervals.length <= 2 * 104
intervals[i].length == 2
-106 <= starti <= endi <= 106
- 每个间隔的起点都 不相同
class Solution {
public int[] findRightInterval(int[][] intervals) {
int len = intervals.length;
ArrayList<Integer> arr = new ArrayList<Integer>();
for(int i = 0 ; i < len ; i++ ){
int diff = 65536;
int index = -1;
for(int j = 0; j < len ; j++) {
int tmp = intervals[j][0] - intervals[i][1];
if(tmp >= 0 && tmp<diff) {
index = j;
diff = tmp;
}
}
arr.add(index);
}
len = arr.size();
int[] ans = new int[len];
for(int i = 0 ; i < len ; i++) {
ans[i] = arr.get(i);
}
return ans;
}
}
每日一题,今天是中等题。今天直接采用暴力解法了,题目没有要求。
这题主要难在题目理解。题目所谓的startj要大于endi实际上就是说,每一个区间都取右边的数,之后和左边的数进行对比,如果能够连成一个由小到大的区间就行了。也就是说【0,1】只要能有一组的左边界可以大于等于1,就是答案之一,但是要寻找最小的。那最简单的方法就是暴力求解了。直接两个循环,两个参数,一个记录下标,一个记录差值。由于【4,4】这种可以算是自己自成,所以i==j的时候也不能跳过。
不过暴力的结果就是,实践复杂度和空间复杂度会很高,但是在没有要求的情况下是可以使用的,实际中能过就行。后续再去考虑优化的问题。(当然,工程中不建议)。