題目連結:
題目意譯:
你有著一個指標位於一個大小為 arrLen 的索引值 0。在每一步中,你可以往左或往右一個位置,或是待在同一個位置(該指標在任何時刻都不得超出陣列的範圍)。
給定兩整數 steps 和 arrLen,回傳你的指標在恰好 steps 步之後依舊位於索引值 0 的方法數。由於答案可能太大,先將其模 10 ^ 9 + 7 回傳。
限制:
1 ≦ steps ≦ 500
1 ≦ arrLen ≦ 10 ^ 6
範例測資:
範例 1:
輸入: steps = 3, arrLen = 2
輸出: 4
解釋: 此例中有 4 種方式在 3 步後依舊待在索引值 0:
右、左、待在原地
待在原地、右、左
右、待在原地、左
待在原地、待在原地、待在原地
範例 2:
輸入: steps = 2, arrLen = 4
輸出: 2
解釋: 此例中有 2 種方式在 2 步後依舊待在索引值 0:
右、左
待在原地、待在原地
範例 3:
輸入: steps = 4, arrLen = 2
輸出: 8
解題思維:
定義一個二維陣列 D,其中 D[i][j] 代表著當現在指標位於索引值 i 時,用剩下的 j 步走回到索引值 0 的方法數為何。
可以看到其遞迴式為:
D[0][0] = 1、
D[i][0] = 0,其中 i != 0、
D[i][j] = 0,其中 i < 0 或 i ≧ arrLen、
(上面三式為遞迴停止條件)
D[i][j] = D[i - 1][j - 1] + D[i][j - 1] + D[i + 1][j - 1],其中 0 ≦ i < arrLen 且 j 為任意非負整數。
最後從 D[0][steps] 開始遞迴求解即可。不過當然,請記得在運算過程中時常模 10 ^ 9 + 7 並且算過的 D[i][j] 就不要重複算了,直接挪用即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。