首页 > 其他分享 >【LeeCode】1122. 数组的相对排序

【LeeCode】1122. 数组的相对排序

时间:2023-03-17 22:03:12浏览次数:64  
标签:int res 1122 ++ LeeCode arr2 arr1 new 排序

【题目描述】

给你两个数组,​​arr1​​​ 和 ​​arr2​​​,​​arr2​​​ 中的元素各不相同,​​arr2​​​ 中的每个元素都出现在 ​​arr1​​ 中。

对 ​​arr1​​ 中的元素进行排序,使 ​​arr1​​ 中项的相对顺序和 ​​arr2​​ 中的相对顺序相同。未在 ​​arr2​​ 中出现过的元素需要按照升序放在 ​​arr1​​ 的末尾。

 ​​https://leetcode.cn/problems/relative-sort-array/​


【示例】

【LeeCode】1122. 数组的相对排序_java


【代码】admin

思路:根据arr1出现的次数, 叠加响应的次数即可

package com.company;
// 2023-03-17
import java.util.*;

class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
// 排序, 方便后面直接补位
Arrays.sort(arr1);
// 因为arr1包含arr2, 所以实际的大小就是arr1的长度
int[] res = new int[arr1.length];
// 统计arr1中每个数字出现的频率
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr1.length; i++){
map.put(arr1[i], map.getOrDefault(arr1[i], 0) + 1);
}
int index = 0;
// 方便后面排除元素是否在arr2中出现过
List<Integer> list = new ArrayList<>();
for (int x : arr2){
if (map.containsKey(x)){
int count = map.get(x);
// x元素出现了count次,则添加count
for (int k = 0; k < count; k++){
list.add(x);
res[index++] = x;
}
}
}

for (int xx : arr1){
if (!list.contains(xx)){
res[index++] = xx;
}
}
System.out.println(Arrays.toString(res));
return res;
}
}

public class Test {
public static void main(String[] args) {
new Solution().relativeSortArray(new int[]{2,3,1,3,2,4,6,7,9,2,19}, new int[]{2,1,4,3,9,6}); // 输出:[2,2,2,1,4,3,3,9,6,7,19]
new Solution().relativeSortArray(new int[]{28,6,22,8,44,17}, new int[]{22,28,8,6}); // 输出:[22,28,8,6,17,44]
}
}


【代码】计数排序

package com.company;
// 2023-03-17
import java.util.*;

class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int[] res = new int[1001];

// 以arr1中的元素为下标, 出现的次数为值
for (int x : arr1)
res[x]++;

// 新下标
int index = 0;
for (int y : arr2){
// arr2中的元素在arrr1中出现了
while (res[y] > 0){
arr1[index++] = y;
res[y]--;
}
}

// 在arr2中未出现的元素
// 注意:这里循环的是1001
for (int i = 0; i < 1001; ++i){
while (res[i]-- > 0){
arr1[index++] = i;
}
}
return arr1;
}
}


public class Test {
public static void main(String[] args) {
new Solution().relativeSortArray(new int[]{2,3,1,3,2,4,6,7,9,2,19}, new int[]{2,1,4,3,9,6}); // 输出:[2,2,2,1,4,3,3,9,6,7,19]
// new Solution().relativeSortArray(new int[]{28,6,22,8,44,17}, new int[]{22,28,8,6}); // 输出:[22,28,8,6,17,44]
}
}

标签:int,res,1122,++,LeeCode,arr2,arr1,new,排序
From: https://blog.51cto.com/u_13682316/6128408

相关文章

  • 希尔排序
    【说明】希尔排序算法又称最小增量排序算法,其基本思想是:步骤1:构造一个步长序列delta1、delta2、..、deltak,其中delta1=n/2,后面的每个delta是前一个的1/2,deltak=1:......
  • python 排序算法
    冒泡排序算法比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。......
  • python中的列表排序
    #列表排序:'''#1.通过sort()方法排序,直接修改原列表defsort_list(list_data,rev=False):L.sort()#reverse默认False升序ifrev:L.sort(reverse=True......
  • 点集从上到下,从左到右进行Z字型排序(C++与python实现,自写)
    C++实现:voidPointDisgus(vector<Point>&Points){Pointt;intn=Points.size();inti,j;vector<Point>OutPoints;vector<Point>Points_......
  • 排序算法01随笔
    日月蹉跎现在是2023年03月17日八点五六分,心中想起一句话:“日月蹉跎人已将老功业未成”每个人心中都有个美好的梦,我们如何去实现它,是否能够坚持下去?又需要付出多少?望......
  • Vue.js 列表渲染-列表排序
    视频<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>列表排序</title> <scripttype="text/javascript"src="../js/vue.js"></script> </head>......
  • 基础算法模板之归并排序
    归并排序1.算法分析归并排序是分治的思想,将一个序列分为多个子序列,先让每个子序列有序,再合并已有序的子序列。把长度为n的输入序列分成两个长度为n/2的子序列;对这两个......
  • 基本算法模板之快速排序
    快速排序1.算法描述从数列中挑出一个元素,称为"基准";重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这......
  • python 类中的属性排序
    可以使用Python中的类(class)来定义一个包含姓名和年龄的类。以下是一个示例代码:classPerson:def__init__(self,name,age):self.name=namese......
  • 冒泡排序
    1.描述:冒泡排序是一种常见的排序方法,遍历若干个需要排序的数列,依次比较相邻两个数值的大小,前者比后者大调换位置,渐进式循环后大的数值都会在最后,重复此操作直到出现有序的......