力扣打卡:剑指 Offer II 012. 左右两边子数组的和相等
解题思路
暴力求解
- for 循环,遍历每一个元素
- 求左右两边的和
- 判断是否相等
暴力求解效率太低了,做了很多重复的工作,每一个元素左右两边的求和都是重复动作
思路
因为暴力求解中每一个元素的左右两边求和都是重复动作
- 先将总和求出,而后左右两边相隔一个元素,中心坐标是p,使用p坐标进行增加
- 判断是否相等
- 左边元素每次累加
lsum += nums[p-1]
- 右边元素每次减少
rsum -= nums[p++]
代码
class Solution {
public int pivotIndex(int[] nums) {
long lsum=0,rsum=0;// 使用long类型记录左边右边和
for(int x: nums) rsum+=x; // 先求右边和
int p = 0; // 可以直接写成1
while(p<nums.length){ // 迭代
if(p==0) rsum-=nums[p++]; // 每次空格一个p,左边是p-1,右边是p+1,如果p初始化为1,可以不写
if(lsum==rsum) return p-1; // 判断是否相等
lsum += nums[p-1]; // 在不满足条件lsum==rsum下,lsum进行增加
rsum -= nums[p++]; // 在不满足条件lsum==rsum下,rsum进行减少
}
if(lsum==rsum) return p-1; // 判断最后一个中心坐标,因为在while中没有进行判断
return -1;
}
}