java进化之路day04

趁着五一之前出去玩了一圈,好多天没写代码,捡起来,不能丢!

436. 寻找右区间

难度 中等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;
}

 

 总结:最近贪玩懈怠了很多,因为打算最后放纵自己一次,趁着五一前期人还没都出去陪对象一起在北京玩了好几天,回来也该收收心啦,一边学东西,一遍找实习吧,感觉自己还是差好多,慢慢来吧,努力总会有希望的对吧!回到这个题,除了排序哪里,剩下的我感觉就是比较常规了,把这个排序方法记上吧!!

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值