我的问题是:
给定一个非负整数数组,您最初位于该数组的第一个索引处。
数组中的每个元素代表您在该位置的最大跳转长度。
确定您是否能够到达最后一个索引。
下面是我的代码:
class Solution {
public:
bool canJump(vector<int>& nums) {
int index=nums.size()-1;
bool ans=dfs(nums,0);
return ans;
}
bool dfs(vector<int>&nums,int start)
{
if(start>=0 && start<nums.size())
{
if(start == nums.size()-1)
{
return true;
}
if(nums[start] == 0)
{
return false;
}
else if(start>=nums.size())
{
return false;
}
for(int i=1;i<=nums[start];i++)
{
bool check = dfs(nums,start+i);
if(check == true)
{
return true;
}
}
}
return false;
}
};
然而,我得到了最后一个测试用例的tle:这是最后一个测试用例
我如何优化我的代码?请帮助
谢了。
边界实质上是n<=10^5
,这意味着您必须为此提出一个O(n*log(n))
解决方案。 如果您对DFS进行记忆,那么DFS可以简单地简化为O(n^2)
,但是在当前的非记忆状态下,DFS的速度要慢得多。 其背后的思想是,您可以使用一个数据结构,如Fenwick树(也称为二进制索引树,或位)来存储一个位置是否可以到达末尾。 然后,您可以在o(log(n))
中获取范围的和,并更新o(log(n))
中的元素。 然后,您可以将输入数组定义为nums
,该数组包含索引是否可能是poss
,并且将从i
到j
的poss[x]
的和(包括j
,但不包括i
)定义为sum(poss,i,j)
。 您可以通过以下公式计算poss
:
poss[n - 1] = 1
poss[i] = max(1, sum(poss, i, min(i + nums[i], n - 1)))