fvdcx's blog


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

leetcode-word-ladder

发表于 2016-12-20   |   分类于 算法 , leetcode   |  

题目大意

  https://leetcode.com/problems/word-ladder/

  给你一个起始字符串和终止字符串,和一个字符串数组,让你求出起始字符串和终止字符串的距离,距离上的路径上相邻字符串只有一个字符不相同,并且属于字符串数组的。

题目分析

  这个题本质上类似图论上的最短路径,并要求路径上字符串的距离为1,但这么做直接TLE。要用BFS,思路参考了:https://discuss.leetcode.com/topic/17890/another-accepted-java-solution-bfs/ 但有几个坑的地方容易导致TLE:

  1. 不要用二维数组提前计算两两字符串距离,很多次计算是没有用的,因为两个字符串距离只会被计算一次。
  2. 计算字符串下一相邻节点时,最好不要遍历整个set取其中未访问的,而是应该根据字符串可能的下一层可能进行扩展,因为单个字符的可能一共就是26个。这么做每次生成下一层的复杂度是26 * 字符串长度,而如果遍历整个set生成下一层复杂度是set元素个数,当字符串平均长度远远小于set中元素个数时,效率差别有很明显。
  3. 直接就用Set的唯一性判断是否访问过就行,没有必要单独引入一个辅助数组标记访问过。
  4. 层数可以再开一个辅助队列,也可以按下面代码,在每一层的节点都放入队列以后,再push进入一个null,再出队时,如果是null,意味着上一层已经全部访问过了,该访问新的一层了,因此level++
阅读全文 »

leetcode-matchsticks-to-square

发表于 2016-12-18   |   分类于 算法 , leetcode   |  

题目大意

  https://leetcode.com/problems/matchsticks-to-square/

  给你一个数组,无重复地选出4组数,每组数之和相等。

题目分析

  自己写了个dfs解法,没有写对,参考了讨论区的dfs的一个优雅做法:https://discuss.leetcode.com/topic/72107/java-dfs-solution-with-explanation 用了四个数字保存四条边的累计和,每次拓展最多有四个方向。但是这样做可以AC,但是不够优化,注意可以先将数组倒序,这样从先往后搜索时先遇到大的数可以进行剪枝掉了,如果从小的开始,可能需要很久才能“凑够”一个边长。经过排序优化后程序运行时间有1000多降到40几。这个题目理论上可以动态规划解,但实际不好设计保存状态的数据结构。

阅读全文 »

leetcode-total-hamming-distance

发表于 2016-12-18   |   分类于 算法 , leetcode   |  

题目大意

  https://leetcode.com/contest/leetcode-weekly-contest-13/problems/total-hamming-distance/

  求n个整数的任意两个数的汉明距离之和。

题目分析

  首先求两个数的汉明距离之和,可以进行逐位比较,也可以求两个数的异或,然后统计1的个数。如果求n个数的两两汉明距离之和需要一些技巧,应该逐位比较,在每一位上如何计算两两距离之和?由乘法原理,其实只要计算0的个数再乘以1的个数即可,最后逐位之和累加。  

阅读全文 »

leetcode-sort-colors

发表于 2016-12-17   |   分类于 算法 , leetcode   |  

题目大意

  https://leetcode.com/problems/sort-colors/

  数组中只含有0,1,2三种数,要求排序数组,时间复杂度O(n),并且one-pass,空间复杂度O(1)

题目分析

  双指针,用p0和p1记录下一个需要放入的位置坐标,具体可以看下代码

阅读全文 »
1…192021…38
fvdcx

fvdcx

149 日志
14 分类
20 标签
GitHub
© 2015 - 2017 fvdcx
由 Hexo 强力驱动
主题 - NexT.Pisces