我有一个算法可以检查游戏行是否可以解决。游戏行是一个正整数数组,其中最后一个元素为0.游戏标记从索引0开始,沿着数组移动它所在的整数所指示的步数。
例如,[1,1,0]返回true,而[1,2,0]返回false。 标记也可以向左或向右移动以解决游戏问题。 也就是说,[3,3,2,2,0]是可以解决的。
Algorithm recursiveSolvable(gameArray, index)
if index = gameArray.length - 1 // the last element has been reached
return true
if index < 0 || index >= gameArray.length || arrayList.contains(index)
return false
arrayList.add(index) // store visited indices to avoid infinite loop
else
// move towards the goal (last element) if possible
// otherwise, trace back steps to find another way
return recursiveSolvable(gameArray, index + gameArray[index])
|| recursiveSolvable(gameArray, index - gameArray[index])
我尝试了一些游戏行的例子,并计算了最坏情况下的时间复杂度:
[2, 0] has 2 recursive calls where the first one returns false, and the second one as well
[1, 1, 2, 0] has 5:
go right || go left - false
|
go right || go left - false
|
go right || go left - false (because index 0 has been visited)
|
false (then go left)
其他情况给了我数字,我找不到与输入大小的关系,但是当我运行输入大小为n = 100的程序时,输出会立即显示,所以我假设时间复杂度不是O( 2 ^ n)(像二进制递归)。我更倾向于O(n)......
至于空间复杂性,我不知道如何找到它。
答案 0 :(得分:0)
运行时间确实更像是O(n)。这是因为每个索引位置只调查一次(由于使用arrayList
进行测试)。
精确界限还取决于arrayList
使用的数据结构。它真的是List
还是HashSet
?
出于同样的原因,空间复杂度为O(n)。每个索引位置只能有一个递归方法的化身。