在做题中学习(57):寻找数组的中心下标

724. 寻找数组的中心下标 - 力扣(LeetCode)

解法:前缀和+后缀和

思路:要看一个数是不是中心下标,就看他前面数的和 与 后面数的和 相不相等。

1.i前面数的和,是[0,i-1] 的前缀和,i后面数的和,是[i+1,n-1]的后缀和。

f[i] = f[i-1] + nums[i-1]

2.后缀和(g) 与前缀和(f)差不多:只是倒着来的。

g[i] = g[i+1] + nums[i+1]

细节问题

1.边界情况,如示例三,中心下标在最左端/最右端,那么此时所在位置的前缀/后缀和 = 0

2.前缀和,正着遍历原数组;后缀和,倒着遍历原数组。

3.前缀和 /后缀和  遍历时,越过1 / n-1 ,原因是求和公式会越界。

class Solution 
{
public:
    int pivotIndex(vector<int>& nums) 
    {
       //1.构造前缀和数组
       int n = nums.size();
       vector<int> f(n);
       f[0] = 0;
       for(int i = 1;i<n;i++)
            f[i] = f[i-1] + nums[i-1];

       //2.构造后缀和数组
       vector<int> g(n);
       g[n-1] = 0;
       for(int i = n-2;i>=0;i--)
            g[i] = g[i+1] + nums[i+1];

       //3.使用
       for(int i = 0;i<n;i++)
       {
            if(f[i] == g[i])
                return i;
       }
       return -1;
        
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值