LeetCode -前缀和专题
文章目录
- 一、前缀和
- 二、刷题
一、前缀和
二、刷题
LeetCode 724. 寻找数组的中心下标 原题链接
class Solution {public: int pivotIndex(vector<int>& nums) { vector<int> sum(100010); for (int i = 0; i < nums.size(); i ++) { sum[i] = nums[i]; if (i) { sum[i] = sum[i - 1] + nums[i]; // 计算前缀和 } } if (sum[nums.size() - 1] - sum[0] == 0)// 考虑中心在0的情况 return 0; for (int i = 1; i < nums.size(); i ++) { if (sum[i - 1] == sum[nums.size() - 1] - sum[i]) // [左边部分的和]与[右边部分的和] { return i; } } return -1; }};
LeetCode 1480. 一维数组的动态和 原题链接
class Solution {public: vector<int> runningSum(vector<int>& nums) { for (int i = 1; i < nums.size(); i ++) { nums[i] = nums[i]; if (i) nums[i] += nums[i - 1]; } return nums; }};
LeetCode 1588. 所有奇数长度子数组的和 原题链接
class Solution {public: int sumOddLengthSubarrays(vector<int>& arr) { vector<int> sum(110); int pre, ans = 0; for (int i = 0; i < arr.size(); i ++) { sum[i] = arr[i]; if (i) sum[i] = sum[i - 1] + arr[i]; } for (int i = 1; i <= arr.size(); i += 2) { // 奇数的长度 for (int j = i - 1; j < arr.size(); j ++) { // 以j结尾的起始位置并且长度为i的子数组 if (j - i == -1) { pre = 0; }else { pre = sum[j - i]; } ans += sum[j] - pre; } } return ans; }};