算法28.0
724. 寻找数组的中心下标 - 力扣(LeetCode)
自己的理解:
大体思路是用前缀和数组 然后用状态转移方程求解
求解后面几个元素 不一定要用全部元素减去前面几个元素 还可以使用后缀和
用的前缀和的思想预处理 减少时间复杂度 用空间换时间
细节:
求解方程: 判断是否相等 如果相等 返回那个解
初始化问题 以及 填表顺序
填写f(i)的时候 根据公式 需要的是f(i-1) 所以从左向右填写
填写g(i)的时候 根据公式 需要的是g(i+1) 需要从右向左填写
g(n-1)会发生越界访问情况 g(n-1)= 0
别人的讲解:
暴力解法:每次枚举 然后比较 这样时间复杂度很高
优化暴力解法: 用前缀和简化时间复杂度 用前缀预处理的思想在前缀和的基础上进行微调
用f表示前缀和数组 用g表示后缀和数组 f(x) g(x)哈哈

下面是题目、效果图和代码:


class Solution
{public int pivotIndex(int[] nums) {int n = nums.length;int[] f = new int[n];//因为是从i到i-1 所以没有必要n+1int[] g = new int[n];//1.预处理一下前缀和数组以及后缀和数组//因为初始化数组的时候元素就是0 所以没必要单独赋值为0 直接从1开始就可以了for(int i =1;i < n;i++) f[i] = f[i-1]+nums[i-1];for(int i =n-2;i >= 0 ;i--) //填写g表 从n-1的位置开始填写 又因为n-1的位置是0 我们从n-2的位置开始填写g[i] = g[i+1]+nums[i+1];//2.使用//遍历所有 然后找到要整的情况返回就可以了for(int i = 0;i < n; i++)if(f[i] == g[i])return i ; return -1;}
}
//这种写法也构建数组了 但是填写元素只是“用到”nums数组的元素 很简洁
//xiyu251106&1#4*3
