题目描述
思路解析动画文字版
记住这句:第 i 位 = nums[i][i] 取反。它保证答案与第 i 行至少差一位,对所有行都成立。下面每一帧都在套它。
康托对角线构造:先把 6 个串排成 6×6 方阵。每行一个串,行号 = 串的序号。接下来只盯主对角线(左上到右下)上的 6 个格子。
康托对角线构造:读第 0 行的对角格:nums[0][0] = 0。这是第 0 个串的第 0 个字符(紫色)。当前对角字符 = 0
康托对角线构造:把它翻转:0 → 1,写进答案第 0 位。这一格(蓝色)已定,答案与第 0 行至少在这一位不同。答案第 0 位 = 0 取反 = 1
康托对角线构造:读第 1 行的对角格:nums[1][1] = 0。这是第 1 个串的第 1 个字符(紫色)。当前对角字符 = 0
康托对角线构造:把它翻转:0 → 1,写进答案第 1 位。这一格(蓝色)已定,答案与第 1 行至少在这一位不同。答案第 1 位 = 0 取反 = 1
康托对角线构造:读第 2 行的对角格:nums[2][2] = 0。这是第 2 个串的第 2 个字符(紫色)。当前对角字符 = 0
康托对角线构造:把它翻转:0 → 1,写进答案第 2 位。这一格(蓝色)已定,答案与第 2 行至少在这一位不同。答案第 2 位 = 0 取反 = 1
康托对角线构造:读第 3 行的对角格:nums[3][3] = 1。这是第 3 个串的第 3 个字符(紫色)。当前对角字符 = 1
康托对角线构造:把它翻转:1 → 0,写进答案第 3 位。这一格(蓝色)已定,答案与第 3 行至少在这一位不同。答案第 3 位 = 1 取反 = 0
康托对角线构造:读第 4 行的对角格:nums[4][4] = 1。这是第 4 个串的第 4 个字符(紫色)。当前对角字符 = 1
康托对角线构造:把它翻转:1 → 0,写进答案第 4 位。这一格(蓝色)已定,答案与第 4 行至少在这一位不同。答案第 4 位 = 1 取反 = 0
康托对角线构造:读第 5 行的对角格:nums[5][5] = 1。这是第 5 个串的第 5 个字符(紫色)。当前对角字符 = 1
康托对角线构造:把它翻转:1 → 0,写进答案第 5 位。这一格(蓝色)已定,答案与第 5 行至少在这一位不同。答案第 5 位 = 1 取反 = 0
康托对角线构造:主对角线 6 格全部处理完(蓝色),取反拼起来 = 111000。下面逐行验证它确实与每一行都不同。
逐行验证:对照第 0 行 011010:它的第 0 位是 0,而答案第 0 位是 1,这一位就不同(红格)。所以答案 ≠ 第 0 行。差异位:0 vs 1
逐行验证:对照第 1 行 101100:它的第 1 位是 0,而答案第 1 位是 1,这一位就不同(红格)。所以答案 ≠ 第 1 行。差异位:0 vs 1
逐行验证:对照第 2 行 110001:它的第 2 位是 0,而答案第 2 位是 1,这一位就不同(红格)。所以答案 ≠ 第 2 行。差异位:0 vs 1
逐行验证:对照第 3 行 001110:它的第 3 位是 1,而答案第 3 位是 0,这一位就不同(红格)。所以答案 ≠ 第 3 行。差异位:1 vs 0
逐行验证:对照第 4 行 010011:它的第 4 位是 1,而答案第 4 位是 0,这一位就不同(红格)。所以答案 ≠ 第 4 行。差异位:1 vs 0
逐行验证:对照第 5 行 100101:它的第 5 位是 1,而答案第 5 位是 0,这一位就不同(红格)。所以答案 ≠ 第 5 行。差异位:1 vs 0
构造完成:对第 i 行,答案在第 i 位上和它不同(行号对应的那一位被特意避开),所以 111000 与全部 6 个串都不同,它就是一个合法答案。只看了对角线 n 个格子,没枚举任何串。
n=1 时退化成「翻一位」;n=2 时对角是 nums[0][0] 与 nums[1][1]。
两个高频追问:替代解法(哈希)与思想归类(构造 vs 定位)。
参考代码
from typing import Listclass Solution: def findDifferentBinaryString(self, nums: List[str]) -> str: return ''.join('1' if nums[i][i] == '0' else '0' for i in range(len(nums)))复杂度
- 时间:O(n),只看对角线 n 个字符,每个翻转 O(1)
- 空间:O(1),除答案串外只用常数变量(答案本身 O(n) 是必需输出)
易错点
面试追问把动画讲成自己的话
追问能否把二进制串都转成整数,然后从 0 开始找第一个不在集合里的数?
追问这道题和「缺失的第一个正数 / 寻找缺失数字」是一类思想吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
统计按位或能得到最大值的子集数目
LeetCode 2044 · 中等 · 沿着 回溯套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题