最初思路
遍历数据,每次循环:计算当前元素 左边元素之和 与 右边元素之和 是否相同。需要注意的是,nums[0] 左边视作和为 0,nums[nums.size()-1] 右边视作和为0;
class Solution {
public:
int findMiddleIndex(vector<int>& nums) {
int lefts,rights;
int i;
for(i=0; i<nums.size(); i++) {
lefts=0,rights=0;
for(int j=0; j<i; j++) {
lefts += nums[j];
}
for(int k=i+1; k<nums.size(); k++) {
rights += nums[k];
}
if(lefts == rights) return i;
}
return -1;
}
};
优化
数组总和是不变的,可以先算出整个数组的和,这样就只用算一边,减少一个for循环。
遍历数组至目标元素时,因为左边和与右边和是相同的,左边和+右边和+当前元素 = 数组总和。
要利用好前面的和,因为是一直做加法,前面的和可以一直保留,不需要重新计算。
class Solution {
public:
int findMiddleIndex(vector<int>& nums) {
int total = accumulate(nums.begin(),nums.end(),0);
int sum=0;
for(int i=0; i<nums.size(); i++) {
if(2*sum + nums[i]==total) {
return i;
}
sum += nums[i];
}
return -1;
}
};
不熟的知识点
(1)计算vector的总和
int total = accumulate(nums.begin(), nums.end(), 0);
accumulate(first, last, init)
参数说明:
first:容器中第一个元素的迭代器。|
last:容器中最后一个元素之后的迭代器。
init:初始值,即累加和的初值。
返回值:累加和。