Little BigUs 2024-02-06 13:38 采纳率: 92.7%
浏览 8
已结题

力扣1696问题代码bug

力扣1696题:

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。
一开始你在下标 0 处。每一步,你最多可以往前跳 k 步,但你不能跳出数组的边界。也就是说,你可以从下标 i 跳到 [i + 1, min(n - 1, i + k)] 包含 两个端点的任意位置。
你的目标是到达数组最后一个位置(下标为 n - 1 ),你的 得分 为经过的所有数字之和。
请你返回你能得到的 最大得分 。

我感觉思路没有问题,但是编译不通过,请帮忙看看哪儿出错了

int maxResult(vector<int>& nums, int k) {
        vector<int> ans(nums.size(), 0);
        //第一阶段,选择一步到位与分步到位中的最大值
        ans[0] = nums[0];
        for (int i = 1; i < k; i++) {
            int max_value = 0;
            if (ans[i-1] > 0 && ans[i - 1] > max_value) {
                max_value = ans[i - 1];
            }
            ans[i] = max_value + nums[i];
        }
        //第二阶段,只能分步到位
        for (int i = k; i < nums.size(); i++) {
            int max_value = ans[i - 1];
            for (int j = 1; j < k; j++) {
                if (ans[i - (j + 1)] > max_value) {
                    max_value = ans[i - (j + 1)];
                }
            }
            ans[i] = max_value + nums[i];
        }
        return ans[nums.size() - 1];
    }

  • 写回答

4条回答 默认 最新

  • 叫兽-郭老师 新星创作者: Java技术领域 2024-02-06 13:40
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    在您的代码中,我发现了几个问题。首先,在第一阶段的循环里,max_value 的初始化应该在外层循环之外,否则每次循环都会被重置为 0。另外,在判断 ans[i-1] > max_value 时直接更新 max_value 是不恰当的,因为最初 max_value 并未包含当前步数nums[i]的值。

    下面是修改后的代码:

    int maxResult(vector<int>& nums, int k) {
        vector<int> ans(nums.size(), 0);
        // 初始化第一阶段的最大值
        int max_value = nums[0];
        ans[0] = max_value;
        
        // 第一阶段,选择一步到位与分步到位中的最大值
        for (int i = 1; i < k && i < nums.size(); i++) {
            max_value = max(ans[i - 1], max_value + nums[i]);
            ans[i] = max_value;
        }
        
        // 第二阶段,只能分步到位
        for (int i = k; i < nums.size(); i++) {
            max_value = ans[i - 1];
            for (int j = 1; j <= k && i - j >= 0; j++) {
                max_value = max(max_value, ans[i - j] + nums[i]);
            }
            ans[i] = max_value;
        }
    
        return ans[nums.size() - 1];
    }
    

    现在这段代码应该可以正确解决问题了。主要修复了以下几点:

    1. 初始化 max_valuenums[0]
    2. 修改第一阶段循环内计算 max_value 的方式,使用 std::max 函数比较上一步结果和当前步数加上 nums[i] 的值。
    3. 在第二阶段循环中,确保索引不会越界,并用 std::max 函数更新 max_value
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月21日
  • 已采纳回答 2月13日
  • 创建了问题 2月6日