左右两边子数组的和相等题解

左右两边子数组的和相等

题目描述

给你一个整数数组 nums ,请计算数组的 中心下标 。
数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/tvdfij

class Solution {
    
    
    public int pivotIndex(int[] nums) {
    
    
        int sum = 0, total = 0;
        int sym = 0;
        for(int i = 0; i < nums.length; i++) {
    
    
            total += nums[i];
        }
        for(int j = 1; j < nums.length; j++) {
    
    
            sum += nums[j - 1];
            if(sum == total - sum - nums[j]) {
    
    
                sym = j;
                return sym;
            } else if(sum == total - sum) {
    
    
                return sym = 0;
            } else if(sum != total - sum - nums[j] && sum != total - sum) {
    
    
                return sym = -1;
            }
        }
        return sym;
    }
}

我最初是这样写的,但是有的用例一直不通过,所以看了题解,官方给出的答案确实很简洁,也很巧妙(我应该多动点脑子。。。)
数组总和total,中心下标左侧和sum,右侧和total - sum - nums[i],当左右侧和相等,则有:sum = total - sum - nums[i],即2sum + nums[i] = total
官方给的题解:

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

通过。

猜你喜欢

转载自blog.csdn.net/weixin_45832482/article/details/122507329