目录
题目:
示例:
分析:
给一个数组,让我们找出一个下标,在这个下标左边的元素总和等于这个下标右边的元素总和.
我们可以把整个数组的总和求出来,然后再从左往右遍历一次数组,遍历的同时将遍历过的数累加记录到一个变量中.若遍历到一个数,总和减去它等于遍历过的累加的总和的两倍,那么这个数就是数组的中间,它的下标就是我们要求的下标.
(上图做错了,但是我懒得改了,右下角方框里应该是 (总和-nums[i])/2 == temp) ).
也可以使用前缀和的方法,一样是用一个变量来记录累加的结果,经过三次遍历,第一次遍历记录每个坐标左边累加的结果,第二次遍历记录每个坐标右边累加的结果,第三次遍历寻找到左右累加结果一致的坐标.
代码+运行结果:
cpp
class Solution {
public:
int pivotIndex(vector<int>& nums) {
//统计总和
int SUM=0,temp=0;
for(const int &num:nums) SUM+=num;
for(int i=0;i<nums.size();i++){
if((SUM-nums[i])/2.0==static_cast<double>(temp)) return i;
temp+=nums[i];
}
return -1;
}
};
cpp
class Solution {
public:
int pivotIndex(vector<int>& nums) {
//前缀和
vector<pair<int,int>>cache(nums.size(),make_pair(0,0));
int temp=0;
for(int i=0;i<nums.size();i++){ //获取前缀和
cache[i].first=temp;
temp+=nums[i];
}
temp=0;
for(int i=nums.size()-1;i>=0;i--){ //获取后缀和
cache[i].second=temp;
temp+=nums[i];
}
for(int i=0;i<cache.size();i++){ //若是前缀后缀一致则返回
if(cache[i].first==cache[i].second) return i;
}
return -1;
}
};