leetcode链接:
https://leetcode.cn/problems/minimum-interval-to-include-each-query/
题目分析

方法一: 暴力求解,尝试一下,极有可能会超时,因为hard绝对不会那么easy
方案一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public int[] minInterval(int[][] intervals, int[] queries) { int[] result = new int[queries.length]; int temp, flag;
for (int i = 0; i < queries.length; i++) { temp = queries[i]; flag = -1; for (int j = 0; j < intervals.length; j++) { if (intervals[j][0] <= temp && temp <= intervals[j][1]) { if (flag == -1 || flag > (intervals[j][1] - intervals[j][0] + 1) ) { flag = (intervals[j][1] - intervals[j][0] + 1); } } } result[i] = flag; }
return result; } }
|
结果
超出时间限制
34 / 42 个通过测试用例
分析
时间复杂度:
O( n * m ) <—– 时间复杂度过高,导致直接运行超时
空间复杂度:
O( m )
官方题解
官方: 包含每个查询的最小区间
Java优先级队列解题,浅显易懂

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| class Solution { public int[] minInterval(int[][] intervals, int[] queries) { Arrays.sort(intervals, (o1, o2) -> (o1[0] - o2[0])); int[][] que = new int[queries.length][2]; for(int i = 0; i < queries.length; ++i) { que[i][0] = queries[i]; que[i][1] = i; } Arrays.sort(que, (o1, o2) -> (o1[0] - o2[0])); int[] res = new int[queries.length]; Arrays.fill(res, -1); PriorityQueue<int[]> queue = new PriorityQueue<int[]>((o1, o2) -> (o1[1] - o1[0] - o2[1] + o2[0])); int index = 0; for(int i = 0; i < queries.length; ++i) { while(index < intervals.length && que[i][0] >= intervals[index][0]) { queue.offer(new int[]{intervals[index][0], intervals[index][1]}); index += 1; } while(!queue.isEmpty() && queue.peek()[1] < que[i][0]) { queue.poll(); }
if(!queue.isEmpty()) { int[] t = queue.peek(); res[que[i][1]] = t[1] - t[0] + 1; } } return res;
} }
作者:Sprinboot 链接:https: 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|
个人实现: 实现较为困难,有待于更进一步的推敲
`
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { public int[] minInterval(int[][] intervals, int[] queries) { int[] result = new int[queries.length];
int[][] queriesNew = new int[queries.length][2]; for (int i = 0; i < queries.length; i++) { queriesNew[i][0] = queries[i]; queriesNew[i][1] = i; }
Arrays.sort(intervals, (o1, o2) -> (o1[0] - o2[0])); Arrays.sort(queriesNew, (o1, o2) -> (o1[0] - o2[0])); Arrays.fill(result, -1);
PriorityQueue<int[]> queue = new PriorityQueue<>((o1, o2) -> (o1[1] - o1[0] - o2[1] + o2[0]));
int index = 0;
for (int i = 0; i < queriesNew.length; i++) { while (index < intervals.length && intervals[index][0] <= queriesNew[i][0]) { queue.add(new int[]{intervals[index][0], intervals[index][1]}); index++; } while (!queue.isEmpty() && queue.peek()[1] < queriesNew[i][0]) { queue.poll(); } if (!queue.isEmpty()) { result[queriesNew[i][1]] = queue.peek()[1] - queue.peek()[0] + 1; } } return result; } }
|