Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • 哈希表

  • 双指针

  • 数组

    • 一维模拟
    • 前缀和
      • 303. 区域和检索
      • 304. 二维区域和检索
      • 396. 旋转函数
      • 1177. 构建回文串检测
      • 2559. 统计范围内的元音字符串数
      • 528. 按权重随机选择
    • 差分数组
    • 排序
    • 滚动数组
    • 二维数组
    • 区间问题
    • 摩尔投票法
  • 字符串

  • 链表

  • 树

  • 回溯

  • 动态规划

  • 图

  • 二分查找

  • 贪心

  • 栈&队列

  • 堆

  • 位运算

  • 数据结构设计

  • rui的精选题单

  • 笔试真题

  • LeetCode周赛

  • ACM模式输入输出
  • 数学

  • 数据结构与算法
  • 数组
Nreal
2023-11-01
目录

前缀和

# 303. 区域和检索 (opens new window)

class NumArray {
    int[] preSum;
    public NumArray(int[] nums) {
        int n = nums.length;
        this.preSum = new int[n+1];
        for(int i=1;i<n+1;i++){
            preSum[i] = preSum[i-1]+nums[i-1];
        }
    }
    
    public int sumRange(int left, int right) {
        return preSum[right+1]-preSum[left];
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 304. 二维区域和检索 (opens new window)

class NumMatrix {
    int[][] preSum;
    public NumMatrix(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        preSum = new int[m+1][n+1];
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                preSum[i][j] = preSum[i][j-1]+preSum[i-1][j]-preSum[i-1][j-1]+matrix[i-1][j-1];
            }
        }
    }
    
    public int sumRegion(int row1, int col1, int row2, int col2) {
        return preSum[row2+1][col2+1]-preSum[row2+1][col1]-preSum[row1][col2+1]+preSum[row1][col1];
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 396. 旋转函数 (opens new window)

# 1177. 构建回文串检测 (opens new window)

# 2559. 统计范围内的元音字符串数 (opens new window)

# 528. 按权重随机选择 (opens new window)

class Solution {
    int[] preSum;
    int total;
    // w=[3,1,2,4]
    // 划分为[1,3] [4,4] [5,6] [7,10]
    // 第i个区间的左边界为pre[i]-w[i]+1,右边界为pre[i]
    public Solution(int[] w) {
        preSum = new int[w.length];
        preSum[0] = w[0];
        for(int i=1;i<w.length;i++){
            preSum[i] = preSum[i-1]+w[i];
        }
        total = Arrays.stream(w).sum();
    }
    
    public int pickIndex() {
        int x = (int) (Math.random()*total)+1;
        return binarySearch(x);
    }

    int binarySearch(int x){
        int l = 0,r = preSum.length-1;
        while(l<=r){
            int mid = (l+r)>>>1;
            if(preSum[mid]<x)
                l = mid+1;
            else
                r = mid-1;
        }
        return l;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
一维模拟
差分数组

← 一维模拟 差分数组→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式