深圳网站建设公司简介宁波网站推广代运营
什么时候用?
快速的求出数组的中某一个连续区间的和
怎么用?
1、预处理出来一个前缀和数组;
2、使用前缀和数组,就可以求出区间的和;
值得注意的地方:
数组的下标要从1开始:
因为不用处理特殊的情况;
例题1:
题解代码:
#include <iostream>
#include <vector>
using namespace std;int main() {int n,q;cin>> n>> q;vector<int> arr(n+1);for(int i = 1;i<n+1;i++){cin>>arr[i];}//预处理一个数组vector<long long> dep(n+1);for(int i = 1;i<n+1;i++) {dep[i] = dep[i-1]+arr[i];}//利用预处理的数组int left,right;while(q--){cin>>left>>right;cout<<dep[right]-dep[left-1]<<endl; }return 0;
}
// 64 位输出请用 printf("%lld")
第二题:
题解代码:
#include <iostream>
using namespace std;
#include<vector>
int main() {int n =0,m = 0,q = 0;cin>> n>>m>> q;vector<vector<int>> arr (n+1,vector<int>(m+1));for(int i = 1;i<n+1;i++){for(int j = 1;j<m+1;j++){cin>>arr[i][j];}}//预处理的前缀数组vector<vector<long long >> dep(n+1,vector<long long>(m+1));for(int i = 1;i<n+1;i++){for(int j = 1;j<m+1;j++){dep[i][j] = dep[i][j-1]+dep[i-1][j]-dep[i-1][j-1]+arr[i][j];}}//利用预处理数组;int x1 = 0,y1 = 0,x2 = 0,y2 = 0;while(q--){cin>>x1>>y1>>x2>>y2;cout<<dep[x2][y2]-dep[x1-1][y2]-dep[x2][y1-1]+dep[x1-1][y1-1]<<endl;}return 0;
}
// 64 位输出请用 printf("%lld")
第三题:
题解代码:
class Solution {
public:int pivotIndex(vector<int>& nums) {int n = nums.size();vector<int> f(n), g(n);for (int i = 1; i < n; i++) {f[i]= f[i-1] + nums[i-1];}for (int i = n - 2; i >=0; i--) {g[i] = g[i+1] + nums[i + 1];}// 使用for (int i = 0; i < n; i++) {if (f[i] == g[i]) {return i;}}return -1;}
};
第四题:
题解代码:
class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> f(n), g(n);// 特殊处理一下f[0] = 1;g[n - 1] = 1;for (int i = 1; i < n; i++) {f[i] = f[i - 1] * nums[i-1];}for (int i = n - 2; i >= 0; i--) {g[i] = g[i + 1] * nums[i+1];}//使用这个数组vector<int> ret(n);for (int i = 0; i < n; i++) {ret[i] = f[i] * g[i];}return ret;}
};