JZ012:左右两边子数组的和相等

📃 题目描述

题目链接:左右两边子数组的和相等相同的题

image-20220509214605606

🔔 解题思路

考虑答案是什么情况:存在答案时, 下标左边的数组和 = 下标右边的数组和,可以分别求出两边,然后进行对比,求后边的数组又要进行循环这样时间复杂度过大,或者先求出总和后,每次遍历不断减去,看代码:

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int leftSum = 0, rightSum = 0, res = -1;
        for (int num : nums) {
            rightSum += num;
        }
        for (int cur = 0; cur < nums.size(); cur++) {
            if (cur >= 1) leftSum += nums[cur - 1];
            rightSum -= nums[cur];
            if (leftSum == rightSum) {
                res = cur;
                break;
            }
        }
        return res;
    }
};

但是这样还要有特判(cur > 1),同时rightSum每次也要减去当下遍历到的数;有没有便捷的方法?

利用左右两边相等,而且两边加当下这个值就是数组总和!即:2 * leftSum + nums[cur] = sum, 其中sum时数组总和

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int leftSum = 0, res = -1;
        int sum = accumulate(nums.begin(), nums.end(), 0);
        for (int cur = 0; cur < nums.size(); cur++) {
            if (leftSum * 2 + nums[cur] == sum) {
                res = cur;
                break;
            }
            leftSum += nums[cur];
        }
        return res;
    }
};

💥 复杂度分析

  • 时间复杂度:o(n);
  • 空间复杂度:O(1);
posted @ 2022-05-09 21:54  D-booker  阅读(44)  评论(0)    收藏  举报