You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为数组每个索引i递增其自身及左右各K个元素(含边界检查)

数组范围递增的实现方案

原代码是遍历数组时仅对当前索引元素自增,现在需要修改为:遍历每个索引i时,对i本身及其左右最多K个元素(即区间[i-K, i+K])执行自增操作,同时处理数组边界(超出数组范围的索引忽略)。

方法一:暴力遍历(直观易理解)

直接对每个i计算有效区间,然后遍历区间内的元素执行自增。这种方法逻辑简单,但时间复杂度为O(N*K),当K较大时效率较低。

代码实现(C语言):

for (int i = 0; i < N; i++) {
    // 计算有效区间的起始和结束索引
    int start = max(0, i - K);
    int end = min(N - 1, i + K);
    // 遍历区间内的所有元素并自增
    for (int j = start; j <= end; j++) {
        arr[j]++;
    }
}

方法二:差分数组优化(高效实现)

如果数组规模较大或K值很高,暴力法的效率会很差,这时可以用差分数组来将时间复杂度降到O(N)。差分数组的核心思想是通过记录区间的增减变化,最后通过前缀和得到最终结果。

代码实现(C语言):

// 创建差分数组,大小设为N+1避免处理边界越界
int diff[N + 1] = {0};

for (int i = 0; i < N; i++) {
    int L = max(0, i - K);
    int R = min(N - 1, i + K);
    // 标记区间[L, R]的起始加1
    diff[L]++;
    // 标记区间结束的下一位减1(如果不超出数组范围)
    if (R + 1 < N) {
        diff[R + 1]--;
    }
}

// 计算前缀和,将结果还原到原数组
arr[0] = diff[0];
for (int i = 1; i < N; i++) {
    arr[i] = arr[i - 1] + diff[i];
}

两种方法对比

  • 暴力法:实现简单,适合小规模数组或K较小的场景,时间复杂度O(N*K)。
  • 差分数组:实现稍复杂,但效率极高,适合大规模数组或K较大的场景,时间复杂度O(N)。

内容的提问来源于stack exchange,提问作者sznailc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:54:21