力扣 数组的相对排序

题目描述

给你两个数组,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 中的元素 arr2[i] 各不相同
arr2 中的每个元素 arr2[i] 都出现在 arr1 中

要点分析

方法一:遍历加排序

两次遍历: 第一次遍历将arr2中有的元素添加到ans中, 第二次遍历将arr2中没有的元素添加到ans中, 再将后面添加的元素按照从小到大排序即可

AC代码:

class Solution {public:vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {vector<int>ans;int tag[arr1.size()];//用于记录arr2中是否存在此元素memset(tag,0,sizeof(tag));for(int i=0;i<arr2.size();i++){for(int j=0;j<arr1.size();j++){if(arr1[j]==arr2[i]){tag[j]=1;ans.push_back(arr1[j]);}}}int t=ans.size();//记录需要排序的位置for(int i=0;i<arr1.size();i++){if(tag[i]==0)ans.push_back(arr1[i]);}sort(ans.begin()+t,ans.end());return ans;}
};

方法二:自定义排序

由于数组arr2规定了比较顺序,因此我们可以使用哈希表对该顺序进行映射:即对于数组 arr2中的第 i个元素,我们将 (arr2[i],i) 这一键值对放入哈希表rank 中,就可以很方便地对数组arr1中的元素进行比较。

比较函数的写法有很多种,例如我们可以使用最基础的比较方法,对于元素 x 和 y:

  • 如果 x 和 y 都出现在哈希表中,那么比较它们对应的值 rank[x] 和 rank[y];

  • 如果 x 和 y 都没有出现在哈希表中,那么比较它们本身;

  • 对于剩余的情况,出现在哈希表中的那个元素较小。

AC代码:

class Solution {public:vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {unordered_map<int, int> rank;for (int i = 0; i < arr2.size(); ++i) {rank[arr2[i]] = i;}sort(arr1.begin(), arr1.end(), [&](int x, int y) {if (rank.count(x)) {return rank.count(y) ? rank[x] < rank[y] : true;}else {return rank.count(y) ? false : x < y;}});return arr1;}
};

力扣 数组的相对排序相关推荐

  1. 力扣 数组中的最长山脉

    力扣 数组中的最长山脉 题目描述 我们把数组 A 中符合下列属性的任意连续子数组 B 称为 "山脉": B.length >= 3 存在 0 < i < B.le ...

  2. 力扣解法汇总969- 煎饼排序

    原题链接:力扣 描述: 给你一个整数数组 arr ,请使用 煎饼翻转 完成对数组的排序. 一次煎饼翻转的执行过程如下: 选择一个整数 k ,1 <= k <= arr.length 反转子 ...

  3. 力扣数组算法(c++)(代码随想录数组部分)

    文章一部分内容和图片引用代码随想录和力扣官方题解. 数组(C++) 考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力 数组是存放在连续内存空间上的相同类型数据的集合. 数组可以方便的通过下 ...

  4. js 数组按奇偶拆分_力扣:按奇偶排序数组js

    给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素. 你可以返回满足此条件的任何数组作为答案. 示例: 输入:[3,1,2,4] 输出:[2,4,3,1] 输 ...

  5. 力扣33搜索旋转排序数组

    整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nu ...

  6. 力扣 数组中的第K个最大元素

    给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素. 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 分析:这是个排序题,只要排好序,一切迎刃而解 ...

  7. 力扣百题斩—— 排序篇(一)

    目录 1.将句子排列(简单) 2.上升下降字符串(简单) 第一种方法: 第二种方法: 3.重新排列字符串(简单) 4.两个数组的交集(简单) 第一种方法: 第二种方法: 5.根据数字二进制下1的数目排 ...

  8. LeetCode力扣刷题——千奇百怪的排序算法

    排序算法 一.常见的排序算法         以下是一些最基本的排序算法.虽然在 C++ 里可以通过 std::sort() 快速排序,而且刷题时很少需要自己手写排序算法,但是熟习各种排序算法可以加深 ...

  9. 数组的合并和升序排列_每日“力扣”系列10 下一个排列

    今天继续力扣数组标签的算法题,力扣第31题,难度等级为中等,题目描述如下: 题目要点概括如下: 1.输入部分为一个有顺序的数组,按照数字的前后顺序,这个数字代表着一个位数不定的数字,这里程它为原数字. ...

最新文章

  1. 比特币现金支付接入日本便利店
  2. sql查table,VIEW,sp, function 及 trigger 物件
  3. win7下一次加载和调试sys驱动程序的过程以及捕捉到内核打印字符串函数的输出
  4. 2019-03-15-算法-进化(有效的数独)
  5. 腾讯TIM自动回复内容怎么自定义添加
  6. 三星uboot1.1.6源码分析——start.s(1)
  7. 学计算机不会重装系统正常吗,系统重装不了的原因是什么 重装不了系统的解决方法【图文】...
  8. 图相处理自学(一):数字图像基本概念
  9. TextBox设置ReadOnly属性后后台得不到值解决方法 [转]
  10. 计算机四级网络工程师题目,计算机四级网络工程师题库
  11. 华为安装gsm框架_华为gms框架app下载-华为gms框架2020版下载最新版-乐游网安卓下载...
  12. 360顽固木马专杀工具 千万别用
  13. @Resource详解-代码示例
  14. 数据可视化技术有什么特点
  15. 新税码不显示或者税码被人隐藏,发票校验不显示
  16. hdu Disney's FastPass(状态压缩dp)
  17. Python爬虫之findall和lxml
  18. 2015暑假集训总结
  19. 认真的雪歌词的c语言编码,认真的雪歌词
  20. 有关于3GPP SUL的一些学习

热门文章

  1. redis主从配置转
  2. 0x08标志类型的RTMPE、RTMPTE协议分析
  3. SQL精选习题及解答
  4. spring配置mysql事务管理_Spring 数据库事务管理机制
  5. 中无法打开源文件_Safari浏览器无法打开,如何解决Safari在Big Sur中崩溃的情况...
  6. X86汇编语言从实模式到保护模式20:平坦模型
  7. 【实用工具】之VMware workstation 14中安装CentOS 7
  8. 【X264系列】之命令参数解析
  9. thrift java长连接_利用thrift在c++、java和python之间相互调用
  10. pythonjava有什么区别_Java与Python的区别对比