中心索引是数组中左侧和等于右侧和的下标i(不含nums[i]),std::accumulate是首选工具因其语义清晰、类型安全且优化;需用long long防溢出,显式传0ll;空数组返回-1,单元素时i=0合法,无解时返回-1。

什么是中心索引,以及为什么 std::accumulate 是首选工具
中心索引是指数组中某个下标 i,使得其左侧所有元素之和等于右侧所有元素之和(左侧和与右侧和都不含 nums[i])。关键点在于:左侧和是 nums[0] + ... + nums[i-1],右侧和是 nums[i+1] + ... + nums[n-1]。直接暴力遍历每个位置再分别求左右和,时间复杂度是 O(n²),实际项目里应避免。
更高效的做法是一次预处理总和,再用单次遍历 + 左侧累加的方式推导右侧和:
右侧和 = 总和 − 左侧和 − 当前元素。
C++ 标准库的 std::accumulate 最适合计算总和——它语义清晰、类型安全、且对内置类型有优化。
注意:别手写循环求总和,除非你在嵌入式环境刻意规避 STL;也别用 sum = 0; for(...) sum += nums[i]; 这种冗余写法,std::accumulate 更可靠。
如何用 long long 防止整数溢出
题目没说元素范围,但 LeetCode 原题中 nums[i] 可达 ±10⁴,数组长度可达 10⁴。最坏情况下总和绝对值接近 10⁸,用 int 存总和或左侧和可能溢出(尤其当部分和先超限再减去当前值时)。
实操建议:
- 统一用
long long存总和total和左侧和left_sum - 不要依赖
vector<int>::value_type</int>自动推导——它还是int - 调用
std::accumulate时显式传入0LL作为初始值:long long total = std::accumulate(nums.begin(), nums.end(), 0LL);
边界情况怎么处理:空数组、单元素、无解返回 −1
中心索引定义隐含前提:索引必须在 [0, n-1] 范围内,且左右和都按“不含当前元素”计算。这意味着:
- 空数组
nums.empty()→ 直接返回-1 - 单元素数组:左侧和 = 0,右侧和 = 0,所以
i = 0是合法中心索引 - 找不到满足条件的索引时,必须返回
-1,不能返回未初始化值或抛异常
常见错误是把循环写成 for (int i = 1; i ,漏掉首尾两个可能解。正确写法是完整遍历 <code>[0, n),并在每次迭代中计算:if (left_sum == total - left_sum - nums[i]) return i;
完整可跑代码片段(含测试逻辑)
以下是最小可行实现,已覆盖上述所有要点:
#include <vector>
#include <numeric><p>int pivotIndex(const std::vector<int>& nums) {
if (nums.empty()) return -1;
long long total = std::accumulate(nums.begin(), nums.end(), 0LL);
long long left_sum = 0;
for (int i = 0; i </int></p>
<p>最后一句容易被忽略:函数必须在循环外明确返回 <code>-1</code>。有些人在循环内只写 <code>return i</code>,忘了无解路径,导致未定义行为(尤其开启编译器警告时会报错)。</p></numeric></vector>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











