LeetCode Weekly Contest 13

Leetcode,本次题目比较简单,第一题位操作,第二题小trick,怎么减少计算,第三题剪枝。第四题用word break思路。

Hamming Distance

位操作,先用与操作,把位相同的变为0,不同的变为1,然后统计有多少个1.

Total Hamming Distance

给定n个数,任取两个数,计算Hamming Distance,求所有两两组合的和。如果是直接两两组合,那就是O(n^2) 32, 但是我们可以每一位来看,在每一个bit位上,所产生的Hamming Distance实际上是n个数在这个bit位上,1的个数和0的个数的乘积。那么时间复杂度就是32O(n)

Matchsticks to Square

首先这是个分堆问题,把所有的数字用完,分成四堆,每堆之和必须一样。那我想的是用dfs(nums, flag, need, remain),nums表示数字,flag表示是否使用过,need表示当前堆还要多少数字才能填好,remain表示还有几个堆没有填。其中有一个剪枝:

  1. 如果对于need是堆之和的时候,都没有找到合适的数字组合,那么可以直接判断这个答案无解。

    Concatenated Words

    这个是word break的变形。首先word break,采用的是DP。我们判断一个单词能不能被一个word-set组成,实际上是判断or {word[0,i] && word[i, n] | i = 0 ~ n},就是观察word的子串存不存在set内。brutal force方法是O(n!) 。因为word可以最多由n各子串组成啊。如果我们已经判断word[0~i],每个word[0~j],j <=i是不是由set组成,那么对于word[0~i+1]实际上只要判断一遍word[0~k]是true并且word[k ~i+1]也在set中存在即可。TC减少到O(n^2)。