题目描述
思路解析动画文字版
记住「先数次数(值→次数),再把次数塞进集合查重,撞车就 false」,下面每帧都在套它。
第一段:从左到右扫数组,每遇到一个数字,就在「值 → 出现次数」表里给它加一。
扫到第 0 个,是数字 1(绿色是它之前出现过的位置)。给它的出现次数加一。
数字 1 的出现次数更新到 1(高亮行)。继续往后扫。
扫到第 1 个,是数字 1(绿色是它之前出现过的位置)。给它的出现次数加一。
数字 1 的出现次数更新到 2(高亮行)。继续往后扫。
扫到第 2 个,是数字 1(绿色是它之前出现过的位置)。给它的出现次数加一。
数字 1 的出现次数更新到 3(高亮行)。继续往后扫。
扫到第 3 个,是数字 2(绿色是它之前出现过的位置)。给它的出现次数加一。
数字 2 的出现次数更新到 1(高亮行)。继续往后扫。
扫到第 4 个,是数字 2(绿色是它之前出现过的位置)。给它的出现次数加一。
数字 2 的出现次数更新到 2(高亮行)。继续往后扫。
扫到第 5 个,是数字 3(绿色是它之前出现过的位置)。给它的出现次数加一。
数字 3 的出现次数更新到 1(高亮行)。继续往后扫。
扫到第 6 个,是数字 3(绿色是它之前出现过的位置)。给它的出现次数加一。
数字 3 的出现次数更新到 2(高亮行)。继续往后扫。
扫到第 7 个,是数字 4(绿色是它之前出现过的位置)。给它的出现次数加一。
数字 4 的出现次数更新到 1(高亮行)。继续往后扫。
扫到第 8 个,是数字 5(绿色是它之前出现过的位置)。给它的出现次数加一。
数字 5 的出现次数更新到 1(高亮行)。继续往后扫。
第一段扫完。各数字的出现次数是 1→3,2→2,3→2,4→1,5→1。接下来第二段:把这些次数(3、2、2、1、1)逐个塞进「已见次数」集合查重。
轮到数字 1,出现次数 3。集合里还没有 3,塞进去(高亮行),目前没撞车,继续看下一个数字的次数。
轮到数字 2,出现次数 2。集合里还没有 2,塞进去(高亮行),目前没撞车,继续看下一个数字的次数。
轮到数字 3,它的出现次数是 2。可集合里已经有 2了(高亮行)——说明有两个数字出现次数相同(红色这些就是数字 3 的位置)。立即返回 false。
因为数字 3 的出现次数 2 和前面某个数字撞了车(红色位置),出现次数并非两两不同,答案 false。
边界先想清:空数组 true、两个不同数各 1 次为 false。
面试重点:两层哈希(频率 + 频率查重)。
参考代码
from typing import Listfrom collections import Counterclass Solution: def uniqueOccurrences(self, arr: List[int]) -> bool: vals = list(Counter(arr).values()) return len(vals) == len(set(vals))复杂度
- 时间:O(n),一遍计数 + 一遍查重
- 空间:O(k),k 个不同值的计数表与次数集合
易错点
面试追问把动画讲成自己的话
追问能不能不用第二个集合?
追问这题考的核心是什么?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
找出两数组的不同
LeetCode 2215 · 简单 · 沿着 哈希套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题