这是小川的第393次更新,第427篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第258题(顺位题号是1122)。给定两个数组arr1arr2arr2中的元素是不同的,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]

注意

  • arr1.length,arr2.length <= 1000

  • 0 <= arr1 [i],arr2 [i] <= 1000

  • 每个arr2[i]都是不同的。

  • 每个arr2[i]都在arr1中。

02 第一种解法

题目的意思是对arr1分两部分排序,前部分的顺序要和arr2中元素的顺序一样,剩余不是arr2中的元素,要按照增序排列。

直接翻译题目即可,利用一个HashMap,将arr2中的元素值作为key,因为arr2中的元素不会重复出现,将value设统一值0,接着遍历arr1,如果当前元素在HashMap中存在,就计数出现的次数,赋值到value上,反之就将其存入ArrayList中。遍历arr2,将对应的元素写入到结果数组中,出现几次就写入几次。最后,如果ArrayList中有剩余未处理的数据,就将其排序,再写入到结果数组中去。

此解法的时间复杂度是O(N),最坏的情况可能到O(N^2),空间复杂度是O(N)

public int[] relativeSortArray(int[] arr1, int[] arr2) {
int[] result = new int[arr1.length];
List<Integer> left = new ArrayList<Integer>();
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int num : arr2) {
map.put(num, 0);
}
for (int num : arr1) {
if (map.containsKey(num)) {
map.put(num, map.getOrDefault(num, 0)+1);
} else {
left.add(num);
}
}
int index = 0, i = 0;
while (i<result.length && index<arr2.length) {
int count = map.get(arr2[index]);
while (count > 0) {
result[i++] = arr2[index];
count--;
}
index++;
}
if (left.size() > 0) {
Collections.sort(left);
for (int j=0; j<left.size(); j++) {
result[i++] = left.get(j);
}
}
return result;
}

03 第二种解法

我们也可以使用计数排序算法,简化计算步骤。

此解法的时间复杂度是O(N),空间复杂度是O(N)

public int[] relativeSortArray2(int[] arr1, int[] arr2) {
int[] count = new int[1001];
// 遍历arr1中的元素并计数
for (int num : arr1) {
count[num]++;
}
int index = 0;
// 处理arr2中的元素
for (int num : arr2) {
while (count[num] > 0) {
arr1[index++] = num;
count[num]--;
}
}
// 处理剩余不是arr2中的元素
for (int i=0; i<count.length; i++) {
while (count[i] > 0) {
arr1[index++] = i;
count[i]--;
}
}
return arr1;
}

04 第三种解法

我们也可以直接重写排序方法。

此解法的时间复杂度是O(N log(N)),最坏的情况可能到O(N^2 log(N)),空间复杂度是O(N)

public int[] relativeSortArray3(int[] arr1, int[] arr2) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i<arr2.length; i++) {
map.put(arr2[i], i);
}
// 为方便后面排序,将arr1转成Integer类型的数组
Integer[] sort = new Integer[arr1.length];
for (int i=0; i<sort.length; i++) {
sort[i] = arr1[i];
}
Arrays.sort(sort, new Comparator<Integer>() { @Override
public int compare(Integer a, Integer b) {
// a和b都不是arr2中的元素
if (!map.containsKey(a) && !map.containsKey(b)) {
return a - b;
}
// 不能直接使用map.get(key),会报空指针
return map.getOrDefault(a, arr1.length) -
map.getOrDefault(b, arr1.length);
}
});
// 将排序后的sort数组元素回写到arr1中去
for (int i=0; i<arr1.length; i++) {
arr1[i] = sort[i];
}
return arr1;
}

05 小结

算法专题目前已连续日更超过八个月,算法题文章264+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.1122-相对排序数组(Relative Sort Array)的更多相关文章

  1. LeetCode.922-按奇偶排序数组 II(Sort Array By Parity II)

    这是悦乐书的第354次更新,第379篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第216题(顺位题号是922).给定非负整数的数组A,A中的一半整数是奇数,而剩下的一半 ...

  2. [Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II

    Given an array A of non-negative integers, half of the integers in A are odd, and half of the intege ...

  3. 【Leetcode_easy】1122. Relative Sort Array

    problem 1122. Relative Sort Array 参考 1. Leetcode_easy_1122. Relative Sort Array; 2. helloacm; 完

  4. Relative Sort Array

    Relative Sort Array Given two arrays arr1 and arr2, the elements of arr2 are distinct, and all eleme ...

  5. LeetCode 80. 删除排序数组中的重复项 II

    LeetCode 80. 删除排序数组中的重复项 II

  6. 前端与算法 leetcode 26. 删除排序数组中的重复项

    目录 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 26. 删除排序数 ...

  7. 每天一道面试题LeetCode 80--删除排序数组中的重复项 II(python实现)

    LeetCode 80--删除排序数组中的重复项 II 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输 ...

  8. LeetCode:删除排序数组中的重复项 (Remove Duplicates from Sorted Array)

    public class RemoveDuplicates { /** * 修改数组,使数组有序不重复.超出长度不考虑. * @param 排序数组 * @return 数组不重复数的个数 */ pu ...

  9. LeetCode 80. 删除排序数组中的重复项 II(Remove Duplicates from Sorted Array II)

    题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

随机推荐

  1. css 命名规范 BEM

    在项目的开发过程当中, 我们往往因为日益复杂的css代码而感到力不从心. 如何合理的组织css代码成为了我们前端开发过程中必须考虑到的环节. 在读element源代码的时候, 了解到了BEM的命名风格 ...

  2. 在MariaDB导入sql文件出现乱码解决方案

    第一方式: 命令: mysql -u(用户名) -p --default-character-set=utf8(设置编码) data_name(数据库名)<文件路径 示例: 这时,会有一个假死的 ...

  3. hive三种调用方式

    一.hive -e ‘sql语句’ (shell命令) 适合比较短的sql语句调用,优点是可以直接在shell中调用静音模式 -S 在执行HiveQL过程中,不在显示器输出MR的执行过程hive -S ...

  4. ajax上传文件(javaweb)

    前台:FormData,     formData.append("fileName",$("#file")[0].files[0];); https://ww ...

  5. Codevs 1200 同余方程 2012年NOIP全国联赛提高组

    1200 同余方程 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 求关于 x 同余方程 a ...

  6. sh_13_字典的应用场景

    sh_13_字典的应用场景 # 使用 多个键值对,存储 描述一个 物体 的相关信息 —— 描述更复杂的数据信息 # 将 多个字典 放在 一个列表 中,再进行遍历 card_list = [ {&quo ...

  7. Jmeter -- 循环控制器和线程并发(关注执行顺序)

    测试计划中包含两个线程组,分别设置如下: 线程组1:线程数为2,循环次数为4 线程组2:线程数为4 执行顺序 监听器View Results in Table(用表格查看结果)中,ThreadName ...

  8. python2topython3遇到的问题

  9. 如何用Sha256进行简单的加密或者解密

    个人是今天第一次使用Sha256对数据进行加密操作,以往都是直接使用MD5加密最多也就是加盐之后再进行加密 不过可能是个人应用的只是简单的一个对数据的加密,所以感觉目前和MD5差距并不是很大. 1.首 ...

  10. springboot+dubbo+zookeeper+mybatis

    参考地址:https://www.cnblogs.com/gaopengfirst/p/9555240.html 首先创建一个maven项目: 再在该父项目中创建3个module,分别是:provid ...