Swift 数据结构与算法( 37) + Leetcode1207. 独一无二的出现次数(哈希)

76 阅读4分钟

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)

错误与反思

当时的思路

  1. 使用字典 occurrences 来计算数组中每个数字的出现次数。
  2. 使用 Set 来检查出现次数的唯一性。因为 Set 是一个不包含重复元素的集合,所以如果 Set 的大小与字典中的值的数量相同,那么所有的出现次数都是唯一的。

易错的部分

  1. 没有使用 Set:在不使用 Set 的情况下检查唯一性可能会更复杂,需要更多的代码和可能的错误。
  2. 忽略了数字的负值:题目中的数字可以是负数。如果没有考虑到这一点,可能会导致错误的结果。
  3. 没有正确处理数字的出现次数:如果没有正确地更新数字的出现次数,可能会导致错误的结果。

如何避免错误

  1. 仔细阅读题目:确保您完全理解题目的要求和限制。
  2. 简化思路:在开始编写代码之前,思考是否有更简单或更直接的方法来解决问题。
  3. 使用合适的数据结构:在这种情况下,使用 Set 是一个很好的选择,因为它自动处理了唯一性的问题。
  4. 测试代码:使用各种测试用例,特别是边界情况,来测试您的代码,确保它在所有情况下都能正确工作。

概念

使用场景与应用

核心概念:哈希映射 (Hash Map) 和 集合 (Set)

这题的核心概念是如何使用哈希映射来统计元素的出现次数,并使用集合来确定这些次数的唯一性。

实际应用场景

  1. 数据分析和统计

    • 技术点:在大量数据中,统计各种元素或事件的出现次数,然后使用集合或其他数据结构来确定这些次数或事件的分布特性。
  2. 日志分析

    • 技术点:从系统或应用日志中提取信息,统计特定错误或事件的发生频率,并确定其独特性。
  3. 推荐系统

    • 技术点:统计用户的行为或喜好,然后基于这些统计数据为用户提供个性化的推荐。

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

  1. 用户行为分析

    • 技术应用:在应用内部,可以使用哈希映射来跟踪用户与特定功能或页面的交互次数。随后可以使用集合来确定哪些功能最受欢迎或最少使用,从而进行应用优化。
  2. 缓存管理

    • 技术应用:使用哈希映射来存储缓存数据,其中键是数据的唯一标识符,如 URL,值是实际的缓存数据。可以使用集合来跟踪当前缓存的数据的唯一标识符,以确保不重复缓存数据。
  3. 消息通知去重

    • 技术应用:应用可能会接收来自多个源的消息或通知。为了确保用户不会接收到重复的通知,可以使用哈希映射来统计每条消息的接收次数,并使用集合来确保每条消息只发送一次。