Find the Derangement of An Array

每一个数字都不能放在自己的原始位置,那我们可以考虑两种情况,比如1, 3,如果3不放在第三个位置而放在第1个位置,则此时1有两种方案,一种1就放在第三个位置,一种1不放在地三个位置,如果放在第三个位置,我们要求的结果规模就减少了2,如果不放,则减少了1,再因为这种选择一共可以发生n-1次,所以最后的状态转移方程就是

dp[i] = (i - 1) * (dp[i - 1] + dp[i - 2])

根据上面方程就可以写出代码了

class Solution(object):
    def findDerangement(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 3:
            return 1 if n == 2 else 0

        dp = [0] * (n + 1)
        dp[2] = 1
        for i in xrange(3, n + 1):
            dp[i] = ((i - 1) * (dp[i - 1] + dp[i - 2])) % (10 ** 9 + 7)
        return dp[n]

results matching ""

    No results matching ""