当前位置: 首页> 财经> 创投人物 > 东莞建筑公司_大宗交易的套路你懂吗_品牌网站设计_西安seo顾问公司

东莞建筑公司_大宗交易的套路你懂吗_品牌网站设计_西安seo顾问公司

时间:2025/7/28 6:47:50来源:https://blog.csdn.net/2401_84487219/article/details/146444358 浏览次数:0次
东莞建筑公司_大宗交易的套路你懂吗_品牌网站设计_西安seo顾问公司

一、一维前缀和

  1. 定义
    • 对于数组(a),其前缀和数组(s)定义为(s[i]=a+a[1]+... +a[i]),主要用途是快速计算数组中任意区间的和。
  2. 用法
    • 初始化前缀和数组
      • 代码实现:
        int a[N];  // 原数组
        int s[N];  // 前缀和数组
        s[0]=a[0];
        for (int i = 1; i < N; i++) {s[i]=s[i - 1]+a[i];
        }
        
    • 查询区间和
      • 若查询区间([l,r])的和,可使用(s[r]-s[l - 1])。若(l == 0),则直接返回(s[r])。
      • 代码实现:
        int query(int l, int r) {if (l == 0) return s[r];return s[r]-s[l - 1];
        }
        
  3. 示例
    • 代码示例:
      #include <stdio.h>
      #define N 5
      int main() {int a[N]={1,2,3,4,5};int s[N];s[0]=a[0];for (int i = 1; i < N; i++) {s[i]=s[i - 1]+a[i];}printf("Sum from index 1 to 3: %d\n", query(1,3));  // 输出: 9return 0;
      }
      

二、二维前缀和

  1. 定义
    • 对于二维数组(a),其前缀和数组(s)定义为(s[i][j]=a[0][0]+..... +a[i][j]),主要用途是快速计算二维数组中任意子矩阵的和。
  2. 用法
    • 初始化前缀和数组
      • 代码实现:
        int a[N][M];  // 原二维数组
        int s[N][M];  // 前缀和数组
        s[0][0]=a[0][0];
        for (int i = 1; i < N; i++) {s[i][0]=s[i - 1][0]+a[i][0];
        }
        for (int j = 1; j < M; j++) {s[0][j]=s[0][j - 1]+a[0][j];
        }
        for (int i = 1; i < N; i++) {for (int j = 1; j < M; j++) {s[i][j]=s[i - 1][j]+s[i][j - 1]-s[i - 1][j - 1]+a[i][j];}
        }
        
    • 查询子矩阵和
      • 若查询子矩阵((x1,y1))到((x2,y2))的和,可使用(s[x2][y2]-s[x1 - 1][y2]-s[x2][y1 - 1]+s[x1 - 1][y1 - 1])。若(x1 == 0)或(y1 == 0),则需特殊处理。
      • 代码实现:
        int query(int x1, int y1, int x2, int y2) {if (x1 == 0 && y1 == 0) return s[x2][y2];if (x1 == 0) return s[x2][y2]-s[x2][y1 - 1];if (y1 == 0) return s[x2][y2]-s[x1 - 1][y2];return s[x2][y2]-s[x1 - 1][y2]-s[x2][y1 - 1]+s[x1 - 1][y1 - 1];
        }
        
  3. 示例
    • 代码示例:
      #include <stdio.h>
      #define N 3
      #define M 3
      int main() {int a[N][M] = {{1,2,3},{4,5,6},{7,8,9}};int s[N][M];s[0][0]=a[0][0];for (int i = 1; i < N; i++) {s[i][0]=s[i - 1][0]+a[i][0];}for (int j = 1; j < M; j++) {s[0][j]=s[0][j - 1]+a[0][j];}for (int i = 1; i < N; i++) {for (int j = 1; j < M; j++) {s[i][j]=s[i - 1][j]+s[i][j - 1]-s[i - 1][j - 1]+a[i][j];}}printf("Sum from (1,1) to (2,2): %d\n", query(1,1,2,2));  // 输出: 28return 0;
      }
      

s[i][j]=s[i - 1][j]+s[i][j - 1]-s[i - 1][j - 1]+a[i][j];此代码可转化为子矩阵面积来理解

三、总结

  • 一维前缀和:用于快速计算数组中任意区间的和。
  • 二维前缀和:用于快速计算二维数组中任意子矩阵的和。
  • 这两种前缀和技巧在处理区间和问题时非常高效,能够将时间复杂度从(O(n))或(O(n^{2}))降低到(O(1))。
关键字:东莞建筑公司_大宗交易的套路你懂吗_品牌网站设计_西安seo顾问公司

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: