前缀和-724.寻找数组的中心下标-力扣(LeetCode)
一、题目解析
我们需要求出中心下标处两边的和是否相等。
二、算法解析
解法1:暴力枚举 O(n*2)(时间复杂度)
固定i,计算[0,i-1]的和,计算[i+1,n-1]的和,然后比较是否相等。遍历i为n次,每次计算n-1个数据的值,所以时间复杂度为O(n*2).
解法2:前缀和
而本题被i划分为了两个区间[0,i-1]和[i+1,n-1],所以我们只需要计算出[0,i-1]的前缀和,[i+1,n-1]的后缀和,比较是否相等即可。
由于计算f[0]时会发生越界访问,所以需要提前计算出f[0]的值,由于[0,-1]内没有元素,所以f[0]=0。g[n-1]同理,g[n-1]=0。并且还需要注意计算f[i]是从左往右的,而g[i]则是从右往左。
可以先根据原理去自己实现代码,链接: 724. 寻找数组的中心下标 - 力扣(LeetCode)
三、代码示例
class Solution {
public:int pivotIndex(vector<int>& nums) {int n = nums.size();vector<int> f(n),g(n);//初始化f[i]和g[i]f[0]=0;g[n-1]=0;for(int i = 1;i<nums.size();i++)//计算前缀和f[i]{f[i] = f[i-1]+nums[i-1];}for(int i = n-2;i>=0;i--)//计算后缀和g[i]{g[i] = g[i+1]+nums[i+1];}for(int i = 0;i<nums.size();i++)//遍历所有下标i,判断是否相等{if(f[i] == g[i]) return i;}return -1;}
};
看到最后,如果对您有所帮助还请留下一个免费的赞和收藏,我们下期再见!