力扣 数组的相对排序
力扣 数组的相对排序
题目描述
给你两个数组,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;}
};
力扣 数组的相对排序相关推荐
- 力扣 数组中的最长山脉
力扣 数组中的最长山脉 题目描述 我们把数组 A 中符合下列属性的任意连续子数组 B 称为 "山脉": B.length >= 3 存在 0 < i < B.le ...
- 力扣解法汇总969- 煎饼排序
原题链接:力扣 描述: 给你一个整数数组 arr ,请使用 煎饼翻转 完成对数组的排序. 一次煎饼翻转的执行过程如下: 选择一个整数 k ,1 <= k <= arr.length 反转子 ...
- 力扣数组算法(c++)(代码随想录数组部分)
文章一部分内容和图片引用代码随想录和力扣官方题解. 数组(C++) 考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力 数组是存放在连续内存空间上的相同类型数据的集合. 数组可以方便的通过下 ...
- js 数组按奇偶拆分_力扣:按奇偶排序数组js
给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素. 你可以返回满足此条件的任何数组作为答案. 示例: 输入:[3,1,2,4] 输出:[2,4,3,1] 输 ...
- 力扣33搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nu ...
- 力扣 数组中的第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素. 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 分析:这是个排序题,只要排好序,一切迎刃而解 ...
- 力扣百题斩—— 排序篇(一)
目录 1.将句子排列(简单) 2.上升下降字符串(简单) 第一种方法: 第二种方法: 3.重新排列字符串(简单) 4.两个数组的交集(简单) 第一种方法: 第二种方法: 5.根据数字二进制下1的数目排 ...
- LeetCode力扣刷题——千奇百怪的排序算法
排序算法 一.常见的排序算法 以下是一些最基本的排序算法.虽然在 C++ 里可以通过 std::sort() 快速排序,而且刷题时很少需要自己手写排序算法,但是熟习各种排序算法可以加深 ...
- 数组的合并和升序排列_每日“力扣”系列10 下一个排列
今天继续力扣数组标签的算法题,力扣第31题,难度等级为中等,题目描述如下: 题目要点概括如下: 1.输入部分为一个有顺序的数组,按照数字的前后顺序,这个数字代表着一个位数不定的数字,这里程它为原数字. ...
最新文章
- 比特币现金支付接入日本便利店
- sql查table,VIEW,sp, function 及 trigger 物件
- win7下一次加载和调试sys驱动程序的过程以及捕捉到内核打印字符串函数的输出
- 2019-03-15-算法-进化(有效的数独)
- 腾讯TIM自动回复内容怎么自定义添加
- 三星uboot1.1.6源码分析——start.s(1)
- 学计算机不会重装系统正常吗,系统重装不了的原因是什么 重装不了系统的解决方法【图文】...
- 图相处理自学(一):数字图像基本概念
- TextBox设置ReadOnly属性后后台得不到值解决方法 [转]
- 计算机四级网络工程师题目,计算机四级网络工程师题库
- 华为安装gsm框架_华为gms框架app下载-华为gms框架2020版下载最新版-乐游网安卓下载...
- 360顽固木马专杀工具 千万别用
- @Resource详解-代码示例
- 数据可视化技术有什么特点
- 新税码不显示或者税码被人隐藏,发票校验不显示
- hdu Disney's FastPass(状态压缩dp)
- Python爬虫之findall和lxml
- 2015暑假集训总结
- 认真的雪歌词的c语言编码,认真的雪歌词
- 有关于3GPP SUL的一些学习
热门文章
- redis主从配置转
- 0x08标志类型的RTMPE、RTMPTE协议分析
- SQL精选习题及解答
- spring配置mysql事务管理_Spring 数据库事务管理机制
- 中无法打开源文件_Safari浏览器无法打开,如何解决Safari在Big Sur中崩溃的情况...
- X86汇编语言从实模式到保护模式20:平坦模型
- 【实用工具】之VMware workstation 14中安装CentOS 7
- 【X264系列】之命令参数解析
- thrift java长连接_利用thrift在c++、java和python之间相互调用
- pythonjava有什么区别_Java与Python的区别对比