剑指 Offer II 075. 数组相对排序(中等 排序 数组)

剑指 Offer II 075. 数组相对排序

给定两个数组,arr1 和 arr2,

arr2 中的元素各不相同
arr2 中的每个元素都出现在 arr1 中
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

示例:

输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]

提示:

1 <= arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2 中的元素 arr2[i] 各不相同
arr2 中的每个元素 arr2[i] 都出现在 arr1 中

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/0H97ZC
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

只要对数组按照每一对的第一个索引排序这道题就简单了,直接调用数组排序方法进行排序,需要写出排序方式。
在后面贴出了我第一次写的错误代码,最后的输出是3个[15, 18],也就是说每次list进行add的时候不仅会添加一个新的数组,还会用这个数组把之前的数组覆盖。从网上找到一个帖子说明出现这种情况的原因:我自己的方法跟正确题解的区别在于,正确的题解每次都new了一个新的record,而我一直是在同一个record上进行修改的,而list的add方法引用的是地址,record的元素修改但是地址一直不变,所以最终答案错误。

题解(Java)

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (i1, i2) -> i1[0] - i2[0]);
        List<int[]> list = new ArrayList<>();
        int i = 0;
        while (i < intervals.length) {
            int[] record = new int[] {intervals[i][0], intervals[i][1]};
            int j = i + 1;
            while (j < intervals.length && intervals[j][0] <= record[1]) {
                record[1] = Math.max(intervals[j][1], record[1]);
                j++;
            }
            list.add(record);
            i = j;
        }
        int[][] ans = new int[list.size()][];
        return list.toArray(ans);
    }
}

错误代码:

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (i1, i2) -> i1[0] - i2[0]);
        List<int[]> list = new ArrayList<>();
        int[] record = {intervals[0][0], intervals[0][1]};
        for (int[] interval : intervals) {
            if (interval[0] <= record[1]) {
                record[1] = Math.max(record[1], interval[1]);
            } else {
                list.add(record);
                record[0] = interval[0];
                record[1] = interval[1];
            }
        }
        list.add(record);
        int[][] ans = new int[list.size()][];
        return list.toArray(ans);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值