剑指 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);
}
}