目录
题目:
示例:
分析:
代码+运行结果:
题目:
示例:
分析:
给一个数组,让我们找出一个下标,在这个下标左边的元素总和等于这个下标右边的元素总和.
我们可以把整个数组的总和求出来,然后再从左往右遍历一次数组,遍历的同时将遍历过的数累加记录到一个变量中.若遍历到一个数,总和减去它等于遍历过的累加的总和的两倍,那么这个数就是数组的中间,它的下标就是我们要求的下标.
(上图做错了,但是我懒得改了,右下角方框里应该是 (总和-nums[i])/2 == temp) ).
也可以使用前缀和的方法,一样是用一个变量来记录累加的结果,经过三次遍历,第一次遍历记录每个坐标左边累加的结果,第二次遍历记录每个坐标右边累加的结果,第三次遍历寻找到左右累加结果一致的坐标.
代码+运行结果:
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;}
};
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;}
};