Swift 数据结构与算法( ) + Leetcode 掘金 #日新计划更文活动
题目
760. 找出变位映射
给定两个列表 Aand B,并且 B 是 A 的变位(即 B 是由 A 中的元素随机排列后组成的新列表)。
我们希望找出一个从 A 到 B 的索引映射 P 。一个映射 P[i] = j 指的是列表 A 中的第 i 个元素出现于列表 B 中的第 j 个元素上。
列表 A 和 B 可能出现重复元素。如果有多于一种答案,输出任意一种。
例如,给定
A = [12, 28, 46, 32, 50]
B = [50, 12, 32, 46, 28]
需要返回
[1, 4, 3, 2, 0]
P[0] = 1 ,因为 A 中的第 0 个元素出现于 B[1],而且 P[1] = 4 因为 A 中第 1 个元素出现于 B[4],以此类推。
注:
A, B有相同的长度,范围为[1, 100]。A[i], B[i]都是范围在[0, 10^5]的整数。
class Solution {
func anagramMappings(_ nums1: [Int], _ nums2: [Int]) -> [Int] {
}
}
解题思路🙋🏻 ♀️
边界思考🤔
代码
第一版
class Solution {
func anagramMappings(_ nums1: [Int], _ nums2: [Int]) -> [Int] {
//
if nums1.count < 1 || nums1.count != nums2.count {
return []
}
var IndexArray:[Int] = []
var IndexDict:[Int:Int] = [:]
for (index, item) in nums2.enumerated() {
IndexDict[item] = index
}
for item in nums1 {
if let oldIndex = IndexDict[item] {
IndexArray.append(oldIndex)
}
}
return IndexArray
}
}
class Solution {
func anagramMappings(_ nums1: [Int], _ nums2: [Int]) -> [Int] {
// 创建一个字典来存储nums2中每个数字的索引
var valueToIndexMap: [Int: Int] = [:]
for (index, value) in nums2.enumerated() {
valueToIndexMap[value] = index
}
// 将nums1中的每个值映射到nums2中的相应索引
return nums1.map { valueToIndexMap[$0]! }
}
}
时空复杂度分析
O(n)
错误与反思
顺序记错了. 先 index 后 item
for (index, value) in nums2.enumerated() { valueToIndexMap[value] = index }
1. 代码中有一个不必要的检查:if nums1.count < 1 || nums1.count != nums2.count。题目已经给出了两个数组长度相等的条件,所以这个检查是多余的。
1. 变量命名不够直观。例如,IndexDict 可以更名为 valueToIndexMap 以更清楚地表示其用途。
1. 仔细阅读题目:确保您完全理解了题目的所有条件和限制。
- 简化思路:在开始编写代码之前,先尝试简化您的解决方案。避免加入不必要的检查和步骤。
- 代码审查:在完成代码后,回顾并检查您的解决方案。考虑是否有更简洁或更清晰的方法来实现相同的功能。
- 变量命名:确保变量和函数的命名清晰并描述了其实际用途。
- 持续学习和实践:随着时间的推移和更多的编程经验,您会变得更加熟练,更容易避免这些常见的错误。
概念
这题的核心概念是哈希映射(Hash Map)或字典(Dictionary)。
以下是为什么哈希映射是这题的核心概念:
-
快速查找:哈希映射允许我们在常数时间 (O(1)) 内查找一个元素的值。这对于本题来说是非常有用的,因为我们要为
nums1中的每一个元素找到它在nums2中的索引。 -
键值对存储:哈希映射存储的是键值对。在本题中,我们使用
nums2中的元素值作为键,对应的索引作为值。这使我们可以轻松地找到nums1中的元素在nums2中的位置。 -
处理重复值:题目中提到
A和B可能有重复元素。使用哈希映射,我们可以确保只存储每个值的最后一个索引。但由于题目允许多种答案,这种处理方式是可以接受的。
使用场景与应用
核心概念:哈希映射 (Hash Map) 或 字典 (Dictionary)
哈希映射是一种数据结构,允许我们在常数时间内存储和检索键-值对。对于本题,我们使用哈希映射来存储 nums2 中的数字及其索引,然后快速查找 nums1 中数字的索引。
实际应用场景:
-
数据库查询优化:
- 技术点:在某些数据库中,索引的底层实现可能是哈希表,它可以快速查找和检索数据。
-
缓存系统:
- 技术点:例如,Redis 是一个基于内存的键-值存储系统,它使用哈希表来实现快速数据存储和检索。
-
防止重复:
- 技术点:在处理大量数据时,哈希表可以用来检查数据是否已经存在,以避免重复。
iOS app 开发中的实际使用场景:
- 数据存储与检索:
- 技术应用:在 iOS 应用中,当需要快速存储和检索数据时,可以使用
Dictionary类型。例如,如果要存储用户设置或配置,可以使用键-值对的方式。
- 技术应用:在 iOS 应用中,当需要快速存储和检索数据时,可以使用
- 图像缓存:
- 技术应用:在下载网络图片并显示在应用中时,为了提高性能和响应速度,可以使用哈希表将已下载的图片缓存起来。这样,当同一张图片再次请求时,应用可以直接从缓存中获取,而不是重新下载。
- 处理用户输入:
- 技术应用:当用户在搜索框中输入时,应用可以使用哈希映射来存储用户的历史搜索记录。这样,当用户再次输入相同的查询时,应用可以快速提供建议或自动完成。