Python循环代码顺序疑问:LeetCode 219存在重复元素II解法
为什么
visited[nums[i]] = i必须放在判断条件之后? 颠倒顺序的问题出在哪?
你写的颠倒顺序的代码,会直接把逻辑搞崩:
每次循环先把当前元素的索引i塞进visited字典,紧接着判断nums[i] in visited——这肯定是真的,刚存进去的嘛。然后算abs(i - visited[nums[i]]),结果是0,必然满足<=k的条件。不管数组里有没有符合要求的重复元素,代码第一次循环就会返回True,完全不符合题目要找两个不同位置重复元素的要求。
正确顺序的逻辑意义
先判断、再更新字典的顺序,是为了:
- 先检查当前元素之前有没有出现过(也就是在
visited里存在不) - 如果之前出现过,就验证两次的索引差是否符合
<=k的要求,符合就直接返回True - 如果不符合要求,或者元素是第一次出现,就把当前索引存进(或更新)
visited——这一步是为后续遍历保留最近的旧索引,毕竟越近的索引,和后续元素的索引差越容易满足<=k的条件
学习资源推荐
- 看Python官方文档里的流程控制章节,重点理解代码逐行从上到下执行的规则
- 找基础Python教程里关于循环、条件判断执行顺序的内容,搞清楚变量/字典的实时修改会怎么影响后续代码的执行
内容的提问来源于stack exchange,提问作者Ashley Liu
相关产品推荐
相关产品推荐

