剑指 Offer II 012. 左右两边子数组的和相等

弱智题目。
在这里插入图片描述

指针的左右滑动即可解决这个问题,100%时间复杂度。

class Solution {
    
    
        public int pivotIndex(int[] nums) {
    
    
            int i=0;//i就是这个坐标。
            int left = 0;
            int right = -nums[0];//左右数组之和。
            for (int num : nums){
    
    
                right = right+num;
            }
            while(i<nums.length-1){
    
    
                if(left==right) return i;
                left = left + nums[i];
                right = right - nums[i+1];
                i++;
            }
            if(left==0) return i;
            return -1;
        }
}

当然,也可以用前缀和:

整体数据之和=total,左侧=sum,中间数=num。
那么判断条件就是total - sum - num = sum。
也就是total - num = sum * 2;

先计算整体之和,然后按照这个条件遍历num与sum即可,注意需要开辟一个存放sum的空间。

class Solution {
    
    
    public int pivotIndex(int[] nums) {
    
    
        int total = Arrays.stream(nums).sum();
        int sum = 0;
        for (int i = 0; i < nums.length; ++i) {
    
    
            if (2 * sum + nums[i] == total) {
    
    
                return i;
            }
            sum += nums[i];
        }
        return -1;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37772958/article/details/121846194