LeetCode.1122-相对排序数组(Relative Sort Array)
这是小川的第393次更新,第427篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第258题(顺位题号是1122)。给定两个数组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]
注意:
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)的更多相关文章
- LeetCode.922-按奇偶排序数组 II(Sort Array By Parity II)
这是悦乐书的第354次更新,第379篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第216题(顺位题号是922).给定非负整数的数组A,A中的一半整数是奇数,而剩下的一半 ...
- [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 ...
- 【Leetcode_easy】1122. Relative Sort Array
problem 1122. Relative Sort Array 参考 1. Leetcode_easy_1122. Relative Sort Array; 2. helloacm; 完
- Relative Sort Array
Relative Sort Array Given two arrays arr1 and arr2, the elements of arr2 are distinct, and all eleme ...
- LeetCode 80. 删除排序数组中的重复项 II
LeetCode 80. 删除排序数组中的重复项 II
- 前端与算法 leetcode 26. 删除排序数组中的重复项
目录 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 26. 删除排序数 ...
- 每天一道面试题LeetCode 80--删除排序数组中的重复项 II(python实现)
LeetCode 80--删除排序数组中的重复项 II 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输 ...
- LeetCode:删除排序数组中的重复项 (Remove Duplicates from Sorted Array)
public class RemoveDuplicates { /** * 修改数组,使数组有序不重复.超出长度不考虑. * @param 排序数组 * @return 数组不重复数的个数 */ pu ...
- LeetCode 80. 删除排序数组中的重复项 II(Remove Duplicates from Sorted Array II)
题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
随机推荐
- css 命名规范 BEM
在项目的开发过程当中, 我们往往因为日益复杂的css代码而感到力不从心. 如何合理的组织css代码成为了我们前端开发过程中必须考虑到的环节. 在读element源代码的时候, 了解到了BEM的命名风格 ...
- 在MariaDB导入sql文件出现乱码解决方案
第一方式: 命令: mysql -u(用户名) -p --default-character-set=utf8(设置编码) data_name(数据库名)<文件路径 示例: 这时,会有一个假死的 ...
- hive三种调用方式
一.hive -e ‘sql语句’ (shell命令) 适合比较短的sql语句调用,优点是可以直接在shell中调用静音模式 -S 在执行HiveQL过程中,不在显示器输出MR的执行过程hive -S ...
- ajax上传文件(javaweb)
前台:FormData, formData.append("fileName",$("#file")[0].files[0];); https://ww ...
- Codevs 1200 同余方程 2012年NOIP全国联赛提高组
1200 同余方程 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 求关于 x 同余方程 a ...
- sh_13_字典的应用场景
sh_13_字典的应用场景 # 使用 多个键值对,存储 描述一个 物体 的相关信息 —— 描述更复杂的数据信息 # 将 多个字典 放在 一个列表 中,再进行遍历 card_list = [ {&quo ...
- Jmeter -- 循环控制器和线程并发(关注执行顺序)
测试计划中包含两个线程组,分别设置如下: 线程组1:线程数为2,循环次数为4 线程组2:线程数为4 执行顺序 监听器View Results in Table(用表格查看结果)中,ThreadName ...
- python2topython3遇到的问题
- 如何用Sha256进行简单的加密或者解密
个人是今天第一次使用Sha256对数据进行加密操作,以往都是直接使用MD5加密最多也就是加盐之后再进行加密 不过可能是个人应用的只是简单的一个对数据的加密,所以感觉目前和MD5差距并不是很大. 1.首 ...
- springboot+dubbo+zookeeper+mybatis
参考地址:https://www.cnblogs.com/gaopengfirst/p/9555240.html 首先创建一个maven项目: 再在该父项目中创建3个module,分别是:provid ...