【发布时间】:2020-06-03 13:58:16
【问题描述】:
给定一个非负整数数组 arr,您最初位于数组的起始索引处。当您在索引
i时,可以跳转到i + arr[i]或i - arr[i],检查是否可以到达任何值为0 的索引。(返回true 或false)。
Input: arr = [4,2,3,0,3,1,2], start = 5
Output: true
说明:索引 5 -> 索引 4 -> 索引 1 -> 索引 3
索引 5 -> 索引 6 -> 索引 4 -> 索引 1 -> 索引 3
注意,任何时候都不能跳出数组。
class Solution
{
public:
bool canReach(vector<int>& arr, int start)
{
if(start<0 || start>=arr.size())
{
return false;
}
if(arr[start]==0)
{
return true;
}
bool x = canReach( arr, start+arr[start]);
bool y = canReach( arr, start-arr[start]);
return (x||y);
}
};
【问题讨论】:
-
对我来说很好。请发布实际上失败的代码。
-
可能堆栈空间不足。如果第一次返回 true,则不要进行第二次递归调用。你可以这样结束循环。
-
是的,我需要使用记忆或访问数组打破循环,使其不再访问,谢谢
-
在跳转到 i + arr[i] 或 i - arr[i] 之前;您检查索引是否超出范围。