題目連結:
題目意譯:
你被給定一個索引值從 0 開始數且包含 n 個相異正整數的整數陣列 nums。nums 的一個排列被稱為是「特殊的」,則代表著:
對於所有索引值 0 ≦ i < n - 1,要嘛 nums[i] % nums[i + 1] == 0、要嘛 nums[i + 1] % nums[i] == 0。
回傳特殊排列的個數。由於答案可能很大,先將其模 10 ^ 9 + 7 後再回傳。
限制:
2 ≦ nums.length ≦ 14
1 ≦ nums[i] ≦ 10 ^ 9
範例測資:
範例 1:
輸入: nums = [2,3,6]
輸出: 2
解釋: [3,6,2] 和 [2,6,3] 為 nums 的兩個特殊排列。
範例 2:
輸入: nums = [1,4,3]
輸出: 2
解釋: [3,1,4] 和 [4,1,3] 為 nums 的兩個特殊排列。
解題思維:
首先,窮舉一下並判斷每一個數字可以與哪些數字相鄰。建立一個類似鄰接矩陣(Adjacency Matrix,參見
這題)的關係。
而我們可以看到本題跟旅行推銷員(Travelling Salesman Problem,TSP;參見
這題)有類似之處。
定義一個二維陣列 D[i][j],代表著探訪狀態為 j 且當前最後選定的數字為 i 之後的合法排列方法數。其中 0 ≦ j < 2 ^ n,且每一個位元對應到一個數字有無被選過。可以看到其遞迴式為:
D[i][2 ^ n - 1] = 1,其中 1 ≦ i ≦ n、
D[i][j] = SUM(D[k][j + 2 ^ (k - 1)],其中 1 ≦ i, k ≦ n 、 j != 2 ^ n - 1 且 j & 2 ^ (k - 1) == 0(即數字 k 尚未被選過)。
(SUM(x) 代表著集合 x 中元素之總和)。
可以看到所求即為各個 D[i][2 ^ (i - 1)] 之值總和。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。