Leetcode 1122. Relative Sort Array
题目链接: Relative Sort Array
难度:easy
题目大意:
输入两个数组arr1和arr2,arr2中各个元素都是唯一的,将arr1中的数组元素先按arr2中元素的相对位置来排序,再将剩余元素按数值大小升序排列,返回排序后的数组。
思路:
参考高赞回答
暴力解法:
- 因为0 <= arr1[i], arr2[i] <= 1000,用数组cnt[i]来表示arr1中元素i出现的次数。
- 遍历arr2,如果数组元素n的cnt[n]大于零,将n写入arr1并将cnt[n]减一。将arr1中所包含的arr2元素按arr2中的相对位置排序。
- 遍历cnt[],如果cnt[n]大于零,将n写入arr1并将cnt[n]减一。将arr1特有的数组元素按数值大小升序排列。
大佬解法:
思路同暴力解法,但用TreeMap来统计arr1中各个元素出现的次数,key为arr1中的数组元素,value为其出现的次数。这一方法可以突破arr1数组元素的大小限制。
代码
暴力解法
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int []cnt=new int[1001];//0 <= arr1[i], arr2[i] <= 1000
for(int n:arr1){//cnt[n]表示arr1中n出现的次数
cnt[n]++;
}
int i=0;
for(int n:arr2){
while(cnt[n]-->0){
arr1[i++]=n;
}
}
for(int j=0;j<cnt.length;j++){//arr2中没有的元素按升序排列
while(cnt[j]-->0){
arr1[i++]=j;
}
}
return arr1;
}
}
大佬解法
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
TreeMap <Integer,Integer>map = new TreeMap<>();
for(int n:arr1){//key为arr1中的数组元素,value为出现的次数
map.put(n,map.getOrDefault(n,0)+1);
}
int i=0;
for(int n:arr2){//将arr2中出现的元素排序
for(int j=0;j<map.get(n);j++){
arr1[i++]=n;
}
map.remove(n);
}
for(int n:map.keySet()){//将arr2中没出现的元素排序
for(int j=0;j<map.get(n);j++){
arr1[i++]=n;
}
}
return arr1;
}
}
备注
TreeMap还没学到,学习了一下代码中用到的TreeMap函数,对大佬写的代码做到能理解,比数组好用很多,感叹数据结构对于算法实现的重要性。努力学习。