JZ012:左右两边子数组的和相等
📃 题目描述
题目链接:左右两边子数组的和相等、相同的题
🔔 解题思路
考虑答案是什么情况:存在答案时, 下标左边的数组和 = 下标右边的数组和,可以分别求出两边,然后进行对比,求后边的数组又要进行循环这样时间复杂度过大,或者先求出总和后,每次遍历不断减去,看代码:
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);