leetcode 1122. 数组的相对排序

  • 题目描述
  • 解题思路
  • 执行结果
leetcode 1122. 数组的相对排序


题目描述

  1. 数组的相对排序

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

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

示例 1:

输入: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] 示例 2:

输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6] 输出:[22,28,8,6,17,44]

提示:

1 <= arr1.length, arr2.length <= 1000 0 <= arr1[i], arr2[i] <= 1000 arr2 中的元素 arr2[i] 各不相同 arr2 中的每个元素 arr2[i] 都出现在 arr1 中

解题思路

法1

哈希表:

首先创建一个映射 indexMap,用于记录 arr2 中每个元素的索引。然后,我们使用自定义排序函数 sort.Slice 对 arr1 进行排序。在排序函数中,我们比较 arr1[i] 和 arr1[j] 在 indexMap 中的索引。

如果两个元素都在 arr2 中出现,我们按照 arr2 中的顺序进行排序。 如果只有 arr1[i] 在 arr2 中出现而 arr1[j] 不在,我们将 arr1[i] 排在 arr1[j] 之前。

如果只有 arr1[j] 在 arr2 中出现而 arr1[i] 不在,我们将 arr1[j] 排在 arr1[i] 之前。

如果两个元素都未在 arr2 中出现,我们按照升序进行排序。

最后,我们返回排序后的 arr1。

  • 时间复杂度(O())
  • 空间复杂度(O())

执行结果

法1

func relativeSortArray(arr1 []int, arr2 []int) []int {
 // 创建一个映射来记录arr2中每个元素的索引
 indexMap := make(map[int]int)
 for i, num := range arr2 {
  indexMap[num] = i
 }

 // 自定义排序函数
 sort.Slice(arr1, func(i, j int) bool {
  index1, found1 := indexMap[arr1[i]]
  index2, found2 := indexMap[arr1[j]]

  // 如果arr1[i]和arr1[j]都在arr2中出现,则按照arr2中的顺序排序
  if found1 && found2 {
   return index1 < index2
  }
  // 如果arr1[i]在arr2中出现而arr1[j]不在,则arr1[i]排在arr1[j]之前
  if found1 {
   return true
  }
  // 如果arr1[j]在arr2中出现而arr1[i]不在,则arr1[j]排在arr1[i]之前
  if found2 {
   return false
  }
  // 如果arr1[i]和arr1[j]都未在arr2中出现,则按照升序排序
  return arr1[i] < arr1[j]
 })

 return arr1
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 4 ms , 在所有 Go 提交中击败了 35.00% 的用户 内存消耗: 2.2 MB , 在所有 Go 提交中击败了 56.67% 的用户 通过测试用例: 17 / 17 炫耀一下:



本文由 mdnice 多平台发布

你可能感兴趣的:(后端)