这是小川的第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. Junit(手动/自动)加载

    ssm中测试service层数据 Junit手动加载配置文件 package com.oukele.bookshop_ssm.service; import org.junit.After; impo ...

  2. mongodb为集合新增字段、删除字段、修改字段(转)

    新增字段 为atest集合新增一个字段content db.atest.update({},{$set:{content:""}},{multi:1}) 删除uname字段 db. ...

  3. react入门及简单配置

    直接script引入的不说了 1.npm i -g create-react-app 2.create-react-app my-app (其中my-app为项目名称) 3.进入项目cd my-app ...

  4. (转载)了解Android 4.1,之三:黄油项目 —— 运作机理及新鲜玩意

    Welcome back to GTKA, everyone's favorite investigative series where we learn all about the newest v ...

  5. [人物存档]【AI少女】【捏脸数据】1223今日份的推荐

    点击下载(城通网盘):AISChaF_20191112214754919.png 点击下载(城通网盘):AISChaF_20191111205924765.png

  6. [Python自学] day-16 (JS、作用域、DOM、事件)

    一.JS中的三种函数 1.普通函数 function func(){ console.log("Hello World"); } func() 2.匿名函数 setInterval ...

  7. laravel 之 cookie 使用

    <?php namespace App\Http\Controllers\Admin; use Illuminate\Http\Request; use Illuminate\Http\Resp ...

  8. php+大文件管理

    用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个php文件夹上传下载的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助.此控件PC全平台支持包括mac,li ...

  9. BZOJ 1406: [AHOI2007]密码箱 exgcd+唯一分解定理

    推出来了一个解法,但是感觉复杂度十分玄学,没想到秒过~ Code: #include <bits/stdc++.h> #define ll long long #define N 5000 ...

  10. List集合、泛型、装箱拆箱

    1.List集合 Vector:增删改查都慢 线程同步 线程安全 LlinkedList:以链表结构存储数据,查询慢.增删快 ArrayList:的运行速度比较快 连续数据空间存储数据,查询快(下标) ...