 |
|
9
vegito2002 Oct 7, 2017 4
我个人认为这个题目推理其实并不难想, 以下推理过程虽然话比较多, 不过纯粹是为了表达的严谨, 事实上整个问题思路非常简单.
考虑这四个 pair: [0]: 1 8 [1]: 2 7 [2]: 3 6 [3]: 4 5 我们命名为 pair[0] ~ pair[3] 比较简单的一个事实就是, 而我们要选择的是三个 digit, digit[0] ~ digit[2], 对应个位到百位; digit[1], digit[2]都是比较简单的, 只要找到两个相加等于 9 的就行了, 事实上, 这两个 digit 上面的位置, 只要在上面 pair[0]..[3]当中选择一个就行了; 但是 digit[0]呢? 事实上, digit[0]我们需要两个 pair, 而且要两个相邻的 pair, 这是因为每一个 pair 的和是 9, 而 digit[0]需要做到的和是 10. 所以 digit[0]最后实际上要找到的就是一个 pair[i], 然后一个 pair[i+1], 然后用 pair[i][0] and pair[i-1][1]组成的一个 pair 就行了; 所以我们最后要找到两个相邻的 pair, 然后取这两个 pair 的类似于一个对角线的就行了; 注意, 当 digit[0]选择了两个 pair 之后, 这两个 pair 就无法再参与到其他 digit 的组合当中了: 这是因为剩下的 pair[i][1]只能和 pair[i][0]组合得到 9, 而 pair[i-1][0]只能和 pair[i-1][1]组合得到 9, 但是这两个姘头都已经被作为对角线拿到 digit[0]的制造当中去了;
所以最后问题简化下来就是, 先选两个相邻 digit, 找到对角线(注意, 虽然有两条对角线, 但是只有一种选择方法能够得到 10, 另一个得到的是 8), 这个有 3 中选法; 剩下的两个 pair, 就是参与到 digit[1] and digit[2]的制造当中, 因为是二对二, 所以没有选择问题了, 但是有一个排序问题, 因为你不知道谁给 digit[1], 谁给 digit[2], 所以这里有一个 2!. 然后 digit[1]和 digit[2]分别得到自己的 pair 之后, 内部还要排序, 所以是 2! * 2!. 这里有一个问题, digit[0]内部是否需要继续排序? 答案是不需要, 因为 digit[1] and digit[2]都已经排序过了, 你如果 digit[0]还重新排序, 或者说交换顺序, 最后得到的就肯定有重复; 所以最后得到的答案就是 3 * 2! * (2! * 2!); 注意最后两个 2!的含义跟第一个 2!的含义的区别, 一个是 digit 之间排序, 一个是 digit 内部排序导致的;
我不认为这个问题很弱智, 我感觉了 LeetCode 里面若干题目涉及到的数学其实也就差不多这个水平.
|