本文始发于个人公众号:TechFlow,原创不易,求个关注

今天是LeetCode专题第55篇文章,我们一起来看看LeetCode中的第89题 Gray Code(格雷代码)。

这题的官方难度是Medium,通过率是48.9%,点赞639,反对1545。又是一道反对比点赞多得多的题目,我个人发现其实这些反对很多的题目都有一个特点,就是题意比较晦涩,出题人的意图不太容易get到。不知道是不是老外理解能力不太行,所以都给出了这么多的反对。

我们就来看看这道题的真面目吧。

题意

题目中说gray code,格雷码是一连串n位二进制表示的数字。这一串的数字有一个特点就是第一个数字是0,从0开始后面的每一个数字和前一个数字只有一个二进制位不同。

题目会给定我们一个非负整数n,要求我们生产n位的灰色代码,也就是产生这些数字。并且这些数字是以10进制存储的。

不知道大家看明白没有,我们来看一个样例。

样例

Input: 2
Output: [0,1,3,2]

在上面这个例子当中,输入是2,表示这些数字是两位二进制位构成的,输出是[0, 1, 3, 2]。我们把0,1,3,2翻译成二进制,0是00,1是01,3是11,2是10。排列在一起的话就是00, 01, 11, 10。我们可以发现每一个数和前一个数相差的都是一个二进制位。

题目当中相关的描述就这么多,但其实有很多隐藏的信息没有给,要我们自己猜测。比如说每一个数字只能出现一次,不然的话这个序列就是无穷无尽的。另外一个隐藏信息是,这样的序列应该也不是唯一的,但是题目并没有说是否所有合法的序列都可以通过测试,还是说一定要返回字典序最小的结果。

题目比较晦涩也就算了,这些隐藏信息没有交代清楚,也难怪大家会费解。

题解

当然以上的问题其实也不是事,我们不确定试一次也就知道了,核心还是怎么想出解法来。

干想是没有结果的,还是要先分析搜集一些信息。首先,题目给定的n,限制了每个数能够使用的二进制位的数量。n个二进制位一共能表示的数字有

种,我们无法得知是否这么多数字都能串联起来。假设可行的话,那么这个问题其实就是这
个数如何摆放的问题。

所以问题的关键就是要寻找这样一个序列,根据我们之前解全排列以及各种排列的方法,可以联想得到,这大概率是一个搜索问题。

顺着搜索的思路继续往下,剩下的事情就容易了,我们的起始搜索点是0。题目中要求了每两个相邻的数的二进制位只相差一个,那么我们可以遍历这些二进制位,寻找0的后继节点。同样对于每一个后继节点来说,我们都可以用同样的方法寻找它的后继们。再加上gray code不能包含重复的元素,我们可以在搜索的时候加上剪枝。

这一套其实是一个经典的搜索问题的流程。

如果我们换个思路,虽然也能得到一样的解法,但是思考的过程会不太一样。怎么换思路呢,其实也简单,我们把它想象成一个图论问题。也就是说,每一个数字都是图中的一个节点。如果两个数字之间满足只相差了一个二进制位,那么说明它们之间有一条边相连。整个问题就转变成了我们从0这个点出发,找出所有连通的节点。

对于图上的遍历问题,方法就很固定了就是搜索。也就是说从这个角度思考的话,更加容易想到搜索上面了, 整个思考的链路会更短。这也是为什么很多大神建模的时候喜欢从往图上考虑的原因。

这些都想明白了再来写代码真的就水到渠成了,整个核心代码真的不长:

class 

总结

单纯从思路以及最后的AC代码来看的话,这道题难度应该是很低的,实际上也的确如此,这题的通过率接近50%,已经是Medium难度的下届了。但是相比于做对这题而言,更加重要的是思路。以图论的思维来抽象建模是算法题当中一个非常常见的手段,这是比题目本身更加宝贵的东西。

如果你读过昨天的文章的话,会发现昨天的87题,本质上也是用的一个图论建模的方法。但是从表现形式上来说,这两题真的可以说是完全不一样。建议大家能好好做做这两题,体会一下其中思维和解法的闪光点。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

最少点字典序最短路径_LeetCode 89,因为题目晦涩而被点了1500+反对的搜索问题...相关推荐

  1. 魔众题库系统 v6.4.0 题目导入优化 自动阅卷优化 后台菜单快捷搜索

    魔众题库系统基于PHP开发,可以用于题库管理和试卷生成软件,拥有极简界面和强大的功能,用户遍及全国各行各业. 魔众题库系统发布v6.4.0版本,新功能和Bug修复累计14项,题目导入优化 自动阅卷优化 ...

  2. 百度2016/2017秋招部分题目解析

    今天把百度2016/2017秋招剩余的4星题目,以及少部分有难度或者比较有趣味的3星题目来一起分析下,所以这次就来个合集了(共包含了4个题目),总体来看题目比较简单,所以分析也会写得相对简略一些.尽管 ...

  3. 【Floyed】廉价最短路径

    廉价最短路径 题目大意: 一个图中,在满足最短路的前提下,求最小代价 原题: 题目描述 图是由一组顶点和一组边组成的.一条边连接两个顶点.例如,图1表示了一个有4个顶点V.5条边的图.图中,每条边e是 ...

  4. ccf-csp 2013-2015题目总结

    目 录 2013-12 出现次数最多的数 ISBN号码 最大的矩形 有趣的数 I'm stuck!⭐ 2014-03 相反数 窗口 命令行选项 无线网络 任务调度⭐ 2014-09 相邻数对 画图 字 ...

  5. 容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程

    引入 1.容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油.程序输出分油次数最少的详细操作过程. 思考 这题主要是要求了输出分油次数最少的操作,网上很多算 ...

  6. Leetcode刷题——每日一题题目汇总

    系列文章目录 文章目录 系列文章目录 查找遍历 169. 多数元素 219. 存在重复元素 II 717. 1比特与2比特字符 917. 仅仅反转字母 1725. 可以形成最大正方形的矩形数目 排序 ...

  7. 城市交通导航最短路径查询

    导航最短路径查询系统 上学期期末老师让写一个课程设计,给了很多课题,选了导航最短路径查询系统,题目如下: 1 项目简介 设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一个城市顶点之间的最短路径 ...

  8. 最短路径:Dijkstra、BellmanFord以及SPFA算法

    最短路径问题 1.Dijkstra算法 简介 (1)Dijkstra算法伪代码 (2)C++ 邻接表版代码 (3)优化 (4)题型分析 2.Bellman Ford算法 简介 (1)Bellman算法 ...

  9. 【常用算法总结——最短路径四种方法】

    以下转自https://blog.csdn.net/weixin_42060896/article/details/82216379 例题:HDU 2544 最短路 Time Limit: 5000/ ...

最新文章

  1. 【阿圆实验】Consul HA 高可用方案
  2. 告别视频通话“渣画质”,英伟达新算法最高压缩90%流量
  3. 从入门到精通的Java进阶学习笔记整理,不愧是大佬
  4. C# 仿金山毒霸启动和关闭淡入淡出效果
  5. cnetos6,centos7添加新网卡,系统不识别的解决办法
  6. Oracle11gR2在9x8hk..Windows18669144449 命名进入Oracle
  7. OpenCV学习笔记七-创建滑动条
  8. Spring Cloud是什么,和Dubbo对比呢?
  9. webgl 基础渲染demo_WebGL + ThreeJS 实现实时水下焦散 Part 1
  10. 16.04编译android 7.0,ubuntu16.04 编译Android5.1报错
  11. Kaggle新赛 | 医学影像插管分类,总奖池 5 万美金
  12. angularjs获取上一个元素的id_DOM(1)-DOM概念和获取元素
  13. PHP curl函数制 exec_ch和get_headers
  14. HLW8032做220V电量采集方案测试
  15. 解决TCP延迟应答(Delay ACK)问题的3个小Trick
  16. docker容器内启动mysql服务,报错:New main PID 99 does not belong to service, and PID file is not owned by root.
  17. 今日科技联播:美股暴跌引全球股市崩盘;腾讯跌出全球市值前十
  18. 安装java的心得体会_java实训心得体会范文
  19. 农业借助拼多多的东风实现数字化-纽黑文教育
  20. 怎样理解心藏神,肝藏魂,脾藏意,肺藏魄,肾藏精志?

热门文章

  1. 使用ssl_exporter监控K8S集群证书
  2. 黑客如何让脚本定时执行
  3. 非法关机的时候,postgresql启动故障的解决
  4. Tomcat和Weblogic的区别
  5. 使用Excel公式,获取 当前 Excel 的Sheet页 的 名字
  6. python中gensim内没有summarization的问题
  7. linux dd克隆系统后,Ubuntu14.04 dd命令克隆系统镜像安装到另一台机器上
  8. php 变量传给另外一个函数,将在一个函数中创建的PHP变量传递给另一个
  9. 学了java然后深入_JAVA8学习——从源码角度深入Stream流(学习过程)
  10. 解决Mybatis-plus高版本不向后兼容的问题