Given an array of integers nums
, calculate the pivot index of this array.
The pivot index is the index where the sum of all the numbers strictly to the left of the index is equal to the sum of all the numbers strictly to the index's right.
If the index is on the left edge of the array, then the left sum is 0
because there are no elements to the left. This also applies to the right edge of the array.
Return the leftmost pivot index. If no such index exists, return -1
.
Example 1:
Input: nums = [1,7,3,6,5,6] Output: 3 Explanation: The pivot index is 3. Left sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 Right sum = nums[4] + nums[5] = 5 + 6 = 11
Example 2:
Input: nums = [1,2,3] Output: -1 Explanation: There is no index that satisfies the conditions in the problem statement.
Example 3:
Input: nums = [2,1,-1] Output: 0 Explanation: The pivot index is 0. Left sum = 0 (no elements to the left of index 0) Right sum = nums[1] + nums[2] = 1 + -1 = 0
Constraints:
1 <= nums.length <= 104
-1000 <= nums[i] <= 1000
Note: This question is the same as 1991: https://leetcode.com/problems/find-the-middle-index-in-array/
Given an array of integers nums
, find the pivot index, which is the index where the sum of all the numbers strictly to the left of the index is equal to the sum of all the numbers strictly to the index's right. If no such index exists, return -1.
The most efficient approach to solve this problem is using the prefix sum technique. This avoids redundant calculations by pre-computing cumulative sums.
Calculate the total sum: First, calculate the total sum of all elements in the nums
array.
Iterate and compare: Iterate through the array. For each element at index i
:
leftSum
(sum of elements to the left of i
). This is simply the prefix sum up to i-1
.rightSum
(sum of elements to the right of i
). This is the totalSum
minus the leftSum
minus the element at index i
itself.leftSum
equals rightSum
, return i
.Return -1: If the loop completes without finding a pivot index, return -1.
Here's the code implementation in several languages:
def pivotIndex(nums):
total_sum = sum(nums)
left_sum = 0
for i, num in enumerate(nums):
right_sum = total_sum - left_sum - num
if left_sum == right_sum:
return i
left_sum += num
return -1
class Solution {
public int pivotIndex(int[] nums) {
int totalSum = Arrays.stream(nums).sum();
int leftSum = 0;
for (int i = 0; i < nums.length; i++) {
int rightSum = totalSum - leftSum - nums[i];
if (leftSum == rightSum) {
return i;
}
leftSum += nums[i];
}
return -1;
}
}
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int totalSum = accumulate(nums.begin(), nums.end(), 0);
int leftSum = 0;
for (int i = 0; i < nums.size(); i++) {
int rightSum = totalSum - leftSum - nums[i];
if (leftSum == rightSum) {
return i;
}
leftSum += nums[i];
}
return -1;
}
};
var pivotIndex = function(nums) {
const totalSum = nums.reduce((a, b) => a + b, 0);
let leftSum = 0;
for (let i = 0; i < nums.length; i++) {
const rightSum = totalSum - leftSum - nums[i];
if (leftSum === rightSum) {
return i;
}
leftSum += nums[i];
}
return -1;
};
func pivotIndex(nums []int) int {
totalSum := 0
for _, num := range nums {
totalSum += num
}
leftSum := 0
for i, num := range nums {
rightSum := totalSum - leftSum - num
if leftSum == rightSum {
return i
}
leftSum += num
}
return -1
}
These code examples all follow the same prefix sum approach, providing an efficient solution to the problem. Remember to handle edge cases (empty arrays) appropriately if needed, though this solution implicitly handles them by returning -1 if no pivot is found.