【算法/前缀和/基础前缀和】题解+详细备注(共7题)
2023-09-11 14:20:02 时间
【算法/前缀和/基础前缀和】
303.区域和检索-数组不可变
class NumArray {
public:
vector<int> sums;
NumArray(vector<int>& nums) {
int n = nums.size();
// 获取前缀和
sums.resize(n+1);
for (int i = 0; i < n; i++) {
sums[i+1] = sums[i] + nums[i];
}
}
int sumRange(int i, int j) {
// 根据前缀和O(1)拿到[i,j]的和
return sums[j+1] - sums[i];
}
};
1480.一维数组的动态和
class Solution {
public:
// 求前缀和
vector<int> runningSum(vector<int>& nums) {
int n = nums.size();
vector<int> result(n);
result[0] = nums[0];
for(int i{};i<n;++i){
if(i) result[i] = result[i-1] + nums[i];
}
return result;
}
};
1991.找到数组的中间位置
class Solution {
public:
// 前缀和的应用
int findMiddleIndex(vector<int>& nums) {
int n = nums.size();
vector<int> sums(n+1);
int sumResult = accumulate(nums.begin(),nums.end(),0);
for(int i{};i<n;++i) {
sums[i+1] = sums[i] + nums[i];
if(sums[i]*2 + nums[i] == sumResult) return i;
}
return -1;
}
};
643.子数组最大平均数I
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
int n = nums.size();
vector<double> sums(n+1);
// 使用前缀和将时间复杂度控制在O(n)
for(int i{};i<n;++i) sums[i+1] = sums[i] + nums[i];
double result{INT_MIN};
for(int i{};i<n-k+1;i++){
double average = (sums[i+k] - sums[i])/k;
if(average > result) result = average;
}
return result;
}
};
1413.逐步求和得到正数的最小值
class Solution {
public:
int minStartValue(vector<int>& nums) {
int n = nums.size();
vector<int> sums(n+1);
// 前缀和的应用
// 找最小的前缀和
int minResult{INT_MAX};
for(int i{};i<n;++i){
sums[i+1] = sums[i] + nums[i];
if(sums[i+1] < minResult) minResult = sums[i+1];
}
return minResult >=0 ? 1 : abs(minResult) + 1;
}
};
1588.所有奇数长度子数组的和
class Solution {
public:
int sumOddLengthSubarrays(vector<int>& arr) {
int n = arr.size();
vector<int> sums(n+1);
// 通过前缀和,将时间复杂度控制在O(n^2)
for(int i{};i<n;++i) sums[i+1] = sums[i] + arr[i];
int result{};
for(int i{};i<n;++i){
for(int j{1};(i+j-1)<n;j+=2){
result += (sums[i+j]-sums[i]);
}
}
return result;
}
};
1732.找到最高海拔
class Solution {
public:
int largestAltitude(vector<int>& gain) {
int n = gain.size();
vector<int> sums(n+1);
int result{INT_MIN};
// 前缀和求解
for(int i{};i<n;++i){
sums[i+1] = sums[i] + gain[i];
if(result < sums[i]) result = sums[i];
}
if(result < sums[n]) result = sums[n];
return result;
}
};
相关文章
- Dijkstra最短路径算法
- 【算法】【排序模块】插入排序和快速排序
- 算法笔记之动态规划
- 基于i.MX RT电磁智能车AI算法的一些讨论
- NSGAII算法多目标优化的matlab仿真
- 145 Mahout协同过滤算法
- C#,核心基础算法——大数计算类Skyiv.BigInterger和任意精度算术运算类BigArithmetic源代码
- 【推荐算法】商品推荐_1450
- 字符串匹配算法之 ---- Boyer-Moore 算法
- 一篇文章带你了解JavaScript中的基础算法之“字符串类”
- 基于多麦克风阵列的声源定位算法之GCC-PHAT原理分析
- 数据结构-图的实现以及基础算法-C语言实现
- [算法课]全面翻新计划!第七周全解
- 面试算法题
- 【基础算法】排序 查找 算法
- 算法基础复盘笔记Day08【数学知识】—— 质数、约数、快速幂
- 算法基础复盘笔记Day07【搜索与图论】—— Prim、Kruskal、染色体判定二分图、匈牙利算法
- acwing算法基础课学习笔记(第一章:基础算法)
- 华为OD机试 - VLAN资源池(Java) | 机试题+算法思路+考点+代码解析 【2023】
- 狠补基础-数学+算法角度讲解卷积层,激活函数,池化层,Dropout层,BN层,全链接层
- 决策树与随机森林算法
- 【基础算法】排序-复杂排序之二(找出第K大的数)
- (新手向)N皇后问题详解(DFS算法)
- 《C#零基础入门之百识百例》(十八)算法的概念 -- 特殊回文数
- 编程算法基础-3.2自底向上风格
- Java 理论与实践: 非阻塞算法简介--转载