Swift 数据结构与算法(36) + S_Leetcode760. 找出变位映射(哈希)

90 阅读4分钟

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],以此类推。

 

注:

  1. A, B 有相同的长度,范围为 [1, 100]
  2. 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. 仔细阅读题目:确保您完全理解了题目的所有条件和限制。

  1. 简化思路:在开始编写代码之前,先尝试简化您的解决方案。避免加入不必要的检查和步骤。
  2. 代码审查:在完成代码后,回顾并检查您的解决方案。考虑是否有更简洁或更清晰的方法来实现相同的功能。
  3. 变量命名:确保变量和函数的命名清晰并描述了其实际用途。
  4. 持续学习和实践:随着时间的推移和更多的编程经验,您会变得更加熟练,更容易避免这些常见的错误。

概念

这题的核心概念是哈希映射(Hash Map)字典(Dictionary)

以下是为什么哈希映射是这题的核心概念:

  1. 快速查找:哈希映射允许我们在常数时间 (O(1)) 内查找一个元素的值。这对于本题来说是非常有用的,因为我们要为 nums1 中的每一个元素找到它在 nums2 中的索引。

  2. 键值对存储:哈希映射存储的是键值对。在本题中,我们使用 nums2 中的元素值作为键,对应的索引作为值。这使我们可以轻松地找到 nums1 中的元素在 nums2 中的位置。

  3. 处理重复值:题目中提到 AB 可能有重复元素。使用哈希映射,我们可以确保只存储每个值的最后一个索引。但由于题目允许多种答案,这种处理方式是可以接受的。

使用场景与应用

核心概念:哈希映射 (Hash Map) 或 字典 (Dictionary)

哈希映射是一种数据结构,允许我们在常数时间内存储和检索键-值对。对于本题,我们使用哈希映射来存储 nums2 中的数字及其索引,然后快速查找 nums1 中数字的索引。

实际应用场景

  1. 数据库查询优化

    • 技术点:在某些数据库中,索引的底层实现可能是哈希表,它可以快速查找和检索数据。
  2. 缓存系统

    • 技术点:例如,Redis 是一个基于内存的键-值存储系统,它使用哈希表来实现快速数据存储和检索。
  3. 防止重复

    • 技术点:在处理大量数据时,哈希表可以用来检查数据是否已经存在,以避免重复。

iOS app 开发中的实际使用场景

  1. 数据存储与检索
    • 技术应用:在 iOS 应用中,当需要快速存储和检索数据时,可以使用 Dictionary 类型。例如,如果要存储用户设置或配置,可以使用键-值对的方式。
  2. 图像缓存
    • 技术应用:在下载网络图片并显示在应用中时,为了提高性能和响应速度,可以使用哈希表将已下载的图片缓存起来。这样,当同一张图片再次请求时,应用可以直接从缓存中获取,而不是重新下载。
  3. 处理用户输入
    • 技术应用:当用户在搜索框中输入时,应用可以使用哈希映射来存储用户的历史搜索记录。这样,当用户再次输入相同的查询时,应用可以快速提供建议或自动完成。