提问者:小点点

我正在用递归解决一个问题,但是我在上一个测试用例上得到了一个Tle错误,我该如何优化我的代码呢?


我的问题是:

给定一个非负整数数组,您最初位于该数组的第一个索引处。

数组中的每个元素代表您在该位置的最大跳转长度。

确定您是否能够到达最后一个索引。

下面是我的代码:

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:这是最后一个测试用例

我如何优化我的代码?请帮助

谢了。


共1个答案

匿名用户

边界实质上是n<=10^5,这意味着您必须为此提出一个O(n*log(n))解决方案。 如果您对DFS进行记忆,那么DFS可以简单地简化为O(n^2),但是在当前的非记忆状态下,DFS的速度要慢得多。 其背后的思想是,您可以使用一个数据结构,如Fenwick树(也称为二进制索引树,或位)来存储一个位置是否可以到达末尾。 然后,您可以在o(log(n))中获取范围的和,并更新o(log(n))中的元素。 然后,您可以将输入数组定义为nums,该数组包含索引是否可能是poss,并且将从ijposs[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)))