趁着五一之前出去玩了一圈,好多天没写代码,捡起来,不能丢!
难度 中等229
给你一个区间数组 intervals
,其中 intervals[i] = [starti, endi]
,且每个 starti
都 不同 。
区间 i
的 右侧区间 可以记作区间 j
,并满足 startj
>= endi
,且 startj
最小化 。
返回一个由每个区间 i
的 右侧区间 在 intervals
中对应下标组成的数组。如果某个区间 i
不存在对应的 右侧区间 ,则下标 i
处的值设为 -1
。
思路:这道题必须做,对象都找到了,一个右区间我还找不到么!(开玩笑,勿喷勿喷!)
看到的第一眼,完全懵逼,读了好多遍没读明白,又看了一下示例,emmm,感觉搞懂了y一点点,说说我的理解,就说示例二吧,对于第一个数组[3,4],数组里面没有一个数组满足[starti, endi
]中的starti大于4,所以这个数组对应的就是-1,看第二个数组[2,3],按题目的要求我们要找到一个[starti, endi
]中starti大于等于3且要是最小,所以我们找到了[3,4],及对应的是1。
看一眼时间复杂度,这个肯定要用到排序,就直接整二分呗!
没错!想完这些,我还是,不会!为啥呢,这尼玛是无须的,二分用不了啊!咋整,先排序吧!但是这又是个二维,我丢,不会排,彻底懵逼,不写了,下一题!拜拜了您!
当然,不能这样,得查查怎么整,看了一下官方的解法
找到了解决排序的方法:
Arrays.sort(startIntervals, (o1, o2) -> o1[0] - o2[0]);
哇塞,没见过,我又去查了一下这个,大概意思就是,对startIntervals进行排序,并且对比较器进行了设置,也就是(o1, o2) -> o1[0] - o2[0],我理解的意思就是通过计算o1[0] - o2[0]来进行对每个元素的排序,但是还有个问题,这玩意到底是升序还是降序的,查不到哇!得,自己试试吧!
我把他们是升序还是降序都写在注释上了,至于后面那个 Comparator.comparingInt(o -> o[0]),是java8的一个特性,也是一个返回比较器的方法,就是做比较的,但是我不知道这个要是用这个做降序应该怎么搞,有大神可以在评论区告诉我一下!
OK!最难的问题搞定了,我们来看一看官方的代码到底写了个啥吧
代码理解:
public static int[] findRightInterval(int[][] intervals) { int n = intervals.length; //定义另外一个数组,用于对原数组进行排序等后续操作 int[][] startIntervals = new int[n][2]; for (int i = 0; i < n; i++) { startIntervals[i][0] = intervals[i][0]; startIntervals[i][1] = i; } //大概意思就是排序 对startIntervals 然后 ,判断的比价器 是通过二维数值中的每个一维数组 也就是o o1 o2 之类的,并通过比较o1-o2 来进行排序 //Arrays.sort(startIntervals, (o1, o2) -> o1[0] - o2[0]); Arrays.sort(startIntervals, Comparator.comparingInt(o -> o[0])); int[] ans = new int[n]; //这里就是基本的二分查找了 for (int i = 0; i < n; i++) { int left = 0; int right = n - 1; //用target表示在最后返回时表示是否找到,要是找到的话就让他等于对应的位置,要是找不到这里就一直是-1 int target = -1; while (left <= right) { int mid = left+(right-left/2); //按题目条件进行比较 if (startIntervals[mid][0] >= intervals[i][1]) { target = startIntervals[mid][1]; right = mid - 1; } else { left = mid + 1; } } ans[i] = target; } return ans; }
总结:最近贪玩懈怠了很多,因为打算最后放纵自己一次,趁着五一前期人还没都出去陪对象一起在北京玩了好几天,回来也该收收心啦,一边学东西,一遍找实习吧,感觉自己还是差好多,慢慢来吧,努力总会有希望的对吧!回到这个题,除了排序哪里,剩下的我感觉就是比较常规了,把这个排序方法记上吧!!