前缀和问题
适用于原始数组不会被修改的情况下,频繁查询某个区间的累加和
冷眼观world
社畜
展开
-
【中级】连续的子数组和
class Solution {private: vector<int> preSum;public: bool checkSubarraySum(vector<int>& nums, int k) { int size = nums.size(); if (size < 2) return false; preSum.resize(size + 1, 0);.原创 2022-05-29 23:40:54 · 67 阅读 · 0 评论 -
【中等】统计优美子数组
使用到前缀和技巧,不过这里的前缀和统计的不是和,而是奇数的个数如示例1:nums = [1, 1, 2, 1, 1]preOdd = [0, 1, 2, 2, 3, 4]preOdd[j] - preOdd[i]这个式子可以得到nums在[i, j)区间中奇数的个数然后就可以循环这个preOdd数组,双指针寻找差值为k的次数。class Solution {private: vector<int> preOdd;public: int numberOf.原创 2022-05-29 02:15:01 · 124 阅读 · 0 评论 -
【简单】两数之和
class Solution {private: map<int, int> mp;public: vector<int> twoSum(vector<int>& nums, int target) { for (int i = 0; i < nums.size(); i++) { auto it = mp.find(target - nums[i]); i.原创 2021-12-04 14:21:27 · 55 阅读 · 0 评论 -
【简单】所有奇数长度子数组的和
class Solution {public: int sumOddLengthSubarrays(vector<int>& arr) { int size = arr.size(); vector<int> preSum(size + 1, 0); for (int i = 1; i <= size; i++) preSum[i] = preSum[i - 1] + arr[i - 1.原创 2021-12-03 18:34:02 · 109 阅读 · 0 评论 -
【中等】和可被K整除的子数组
刚开始用前缀和的方法试试,会超时class Solution {public: int subarraysDivByK(vector<int>& nums, int k) { int size = nums.size(); vector<int> preSum(size + 1, 0); for (int i = 1; i <= size; i++) preSum[i] = preSu.原创 2021-12-02 14:44:23 · 558 阅读 · 0 评论 -
【简单】区域和检索-数组不可变
写一个数组,其中每个元素表示的是其前面所有元素的和class NumArray {private: vector<int> arr;public: NumArray(vector<int>& nums) { int size = nums.size(); arr.resize(size + 1); for (int i = 1; i < size + 1; i++) arr[.原创 2021-12-01 15:29:47 · 137 阅读 · 0 评论 -
【中等】二维区域和检索-矩阵不可变
class NumMatrix {private: vector<vector<int>> preSum;public: NumMatrix(vector<vector<int>>& matrix) { int m = matrix.size(); if (m > 0) { int n = matrix[0].size(); p.原创 2021-12-01 15:04:33 · 713 阅读 · 0 评论 -
【中等】和为K的子数组
用普通的前缀和解法会超时class Solution {private: vector<int> preSum;public: int subarraySum(vector<int>& nums, int k) { int size = nums.size(); preSum.resize(size + 1, 0); for (int i = 1; i <= size; i++) .原创 2021-12-01 16:32:54 · 141 阅读 · 0 评论