一个oa题目
来源:4-7 查找表和滑动窗口 Contain Duplicate II
讲武德的年轻人
2022-08-26
波波老师,我今天做了一家公司的oa题目,一共4个题,前三个题都pass了,只有最后一个题,pass了一半的case,其他都超时了。我觉得应该类似于您在《算法与数据结构》课程中讲的线段树,想请教您。
题目是这样的: 给定一个二维数组int[][] input。 对于每个input[i],只有两种情况:情况一: [1, x],表示在坐标轴x的位置设置一个障碍物;情况二: [2, x, size],考虑区间[x - size, x - 1]是否包含障碍物。假设每个input[i]是按照data stream的形式一个一个给出,对于形如[2, x, size]的区间,如果包含障碍物,则标记为0, 如果不包含障碍物,标记为1。最终,返回一个0-1的字符串,表示按顺序遇到的[2, x, size]的连通情况。
比如 input = [[1, 2], [1, 5], [2, 5, 2], [2, 4, 2] ] 返回"10"。因为第一个[2, 5, 2]不包含障碍物2, 5,而[2, 4, 2]则包含。
数据范围: input是1~10^5, 每个可能的坐标值x: 10^(-9) ~ 10^9;
这个问题看数据规模,O(n^2)解法肯定会超时。我当时就先用这个naive解法,把遇到的障碍物放到一个hashset中,然后对于[2, x, size]这种区间,检查[x - size, x - 1]每个元素是否是障碍物。这种思路只能pass一半的case。后来又小优化了一步,用TreeSet存储障碍物,然后遍历每个障碍物,检查是否在给定的区间[x - size, x - 1]。这种思路好一点点,过了一半多一点的case。
所以想请教老师,这个题目的最优解法为何?谢谢您!
1回答
-
是不是我理解错了,这个问题没那么难呀。
遇到 1,把障碍物的坐标扔到一个 TreeSet 里。
遇到 2,相当于问你 [l, r] 的区间里是否有障碍物。直接看 TreeSet.ceiling(l) 的元素是否存在。不存在,为 0;存在且 > r 为 0;否则就是在 [l, r] 区间里有障碍物,为 1。
point 是不需要检查每一个障碍物,因为结果只问你有没有,所以看一个就够(TreeSet 中大于等于 l 的最小元素)。
继续加油!:)
012022-08-26
相似问题