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

前缀和

  1. class Solution {
  2. public int pivotIndex(int[] nums) {
  3. if (nums == null || nums.length == 0) return -1;
  4. int len = nums.length;
  5. // get prefix sum
  6. int[] sum = new int[len];
  7. sum[0] = nums[0];
  8. for (int i = 1; i < len; i++) {
  9. sum[i] = sum[i - 1] + nums[i];
  10. }
  11. // caculate pivote index
  12. for (int i = 0; i < len; i++) {
  13. int leftSum = i == 0 ? 0 : sum[i - 1];
  14. int rightSum = i == len - 1 ? 0 : sum[len - 1] - sum[i];
  15. if (leftSum == rightSum) return i;
  16. }
  17. return -1;
  18. }
  19. }

数组总和

左右两边子数组的和相等.jpg
不需要计算每个元素的前缀和(即不需要计算得到前缀和数组),而是先遍历一遍数组得到总和 total,然后再次遍历数组,得到区间 [0, i] 的前缀和,那么左边就是 sum - nums[i],右边总和就是 total - sum

  1. class Solution {
  2. public int pivotIndex(int[] nums) {
  3. if (nums == null || nums.length == 0) return -1;
  4. int len = nums.length;
  5. // get prefix sum
  6. int total = 0;
  7. for (int i = 0; i < len; i++) {
  8. total += nums[i];
  9. }
  10. // caculate pivote index
  11. int sum = 0;
  12. for (int i = 0; i < len; i++) {
  13. sum += nums[i];
  14. int leftSum = sum - nums[i];
  15. int rightSum = total - sum;
  16. if (leftSum == rightSum) return i;
  17. }
  18. return -1;
  19. }
  20. }