Swift 数据结构与算法( ) + Leetcode 掘金 #日新计划更文活动
题目
1207. 独一无二的出现次数
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
示例 1:
输入: arr = [1,2,2,1,1,3]
输出: true
解释: 在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。
示例 2:
输入: arr = [1,2]
输出: false
示例 3:
输入: arr = [-3,0,1,-3,1,1,1,-3,10,0]
输出: true
提示:
1 <= arr.length <= 1000-1000 <= arr[i] <= 1000
解题思路🙋🏻 ♀️
边界思考🤔
代码
class Solution {
func uniqueOccurrences(_ arr: [Int]) -> Bool {
var dict:[Int:Int] = [:]
var arrDict:[Int:Int] = [:]
for item in arr {
if let count = dict[item] {
dict[item] = count + 1
} else {
dict[item] = 1
}
}
var arr2 = dict.values
for item in arr2 {
if let count = arrDict[item] {
return false
} else {
arrDict[item] = 1
}
}
return true
}
}
优化后的版本
func uniqueOccurrences(_ arr: [Int]) -> Bool {
var dict:[Int:Int] = [:]
var arrDict:[Int:Int] = [:]
for item in arr {
dict[item, default: 0] += 1
}
var set:Set<Int> = []
let newValus = Set(dict.values)
return newValus.count == dict.count ? true : false
}
}
时空复杂度分析
O(n)
错误与反思
当时的思路:
- 使用字典
occurrences来计算数组中每个数字的出现次数。 - 使用
Set来检查出现次数的唯一性。因为Set是一个不包含重复元素的集合,所以如果Set的大小与字典中的值的数量相同,那么所有的出现次数都是唯一的。
易错的部分:
- 没有使用 Set:在不使用
Set的情况下检查唯一性可能会更复杂,需要更多的代码和可能的错误。 - 忽略了数字的负值:题目中的数字可以是负数。如果没有考虑到这一点,可能会导致错误的结果。
- 没有正确处理数字的出现次数:如果没有正确地更新数字的出现次数,可能会导致错误的结果。
如何避免错误:
- 仔细阅读题目:确保您完全理解题目的要求和限制。
- 简化思路:在开始编写代码之前,思考是否有更简单或更直接的方法来解决问题。
- 使用合适的数据结构:在这种情况下,使用
Set是一个很好的选择,因为它自动处理了唯一性的问题。 - 测试代码:使用各种测试用例,特别是边界情况,来测试您的代码,确保它在所有情况下都能正确工作。
概念
使用场景与应用
核心概念:哈希映射 (Hash Map) 和 集合 (Set)
这题的核心概念是如何使用哈希映射来统计元素的出现次数,并使用集合来确定这些次数的唯一性。
实际应用场景:
-
数据分析和统计:
- 技术点:在大量数据中,统计各种元素或事件的出现次数,然后使用集合或其他数据结构来确定这些次数或事件的分布特性。
-
日志分析:
- 技术点:从系统或应用日志中提取信息,统计特定错误或事件的发生频率,并确定其独特性。
-
推荐系统:
- 技术点:统计用户的行为或喜好,然后基于这些统计数据为用户提供个性化的推荐。
iOS app 开发中的实际使用场景:
-
用户行为分析:
- 技术应用:在应用内部,可以使用哈希映射来跟踪用户与特定功能或页面的交互次数。随后可以使用集合来确定哪些功能最受欢迎或最少使用,从而进行应用优化。
-
缓存管理:
- 技术应用:使用哈希映射来存储缓存数据,其中键是数据的唯一标识符,如 URL,值是实际的缓存数据。可以使用集合来跟踪当前缓存的数据的唯一标识符,以确保不重复缓存数据。
-
消息通知去重:
- 技术应用:应用可能会接收来自多个源的消息或通知。为了确保用户不会接收到重复的通知,可以使用哈希映射来统计每条消息的接收次数,并使用集合来确保每条消息只发送一次。