算法练习第27题-寻找数组的中心索引

132 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

一、题目

给你一个整数数组 nums ,请计算数组的 中心下标 。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

 

示例 1:

输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。


示例 2:

输入:nums = [1, 2, 3]
输出:-1
解释:
数组中不存在满足此条件的中心下标。


示例 3:

输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),
右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0

作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re…

来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、思路

思路1

  • 这个题最大的问题是理解什么是中心下标
  • 例如总值为d,左边总值为a,右边总值为c,中间还有一个值b,
  • 这是a = c,那么b就是中心值,这个值的下标就是中心下标
  • 那么我们就先计算总值total,使用reduce计算
  • 定义总长度len,起始位置index = 0, 左侧的总值的起始值为sum = 0
  • 利用while语法,index< len
  • sum += nums[index], index++
  • 如果 sum*2+sum[index] === total
  • 那么index就是中心下标了
  • 如果不存在中心下标,那么就return -1

思路2

  • 将while改为for

三、 代码

思路1代码

let nums = [1, 7, 3, 6, 5, 6]
let pivotIndex = function(nums) {
  /**
   * 这个题最大的问题是理解什么是中心下标
   * 例如总值为d,左边总值为a,右边总值为c,中间还有一个值b,
   * 这是a = c,那么b就是中心值,这个值的下标就是中心下标
   * 那么我们就先计算总值total,使用reduce计算
   * 定义总长度len,起始位置index = 0, 左侧的总值的起始值为sum = 0 
   * 利用while语法,index< len 
   * sum += nums[index], index++
   * 如果 sum*2+sum[index] === total
   * 那么index就是中心下标了
   * 如果不存在中心下标,那么就return -1
   * 
   * **/ 
  let total = nums.reduce((a, b) => a + b, 0), len = nums.length, sum = 0, index = 0
  while(index < len) {
    if(sum * 2 + nums[index] === total) {
      return index
    }
    sum += nums[index]
    index++
  }
  return -1
}
pivotIndex(nums)

思路2代码

let nums = [1, 7, 3, 6, 5, 6]
let pivotIndex = function(nums) {
  let total = nums.reduce((a, b) => a + b, 0), len = nums.length, sum = 0
  
  /**
   * 将while改为for, 
   * 
   * */ 
  for (let i = 0; i < len; i++) {
      if (2 * sum + nums[i] === total) {
          return i;
      }
      sum += nums[i];
  }
  return -1;
}
pivotIndex(nums)

四、测试结果

测试结果1

image.png

测试结果2

image.png

从结果上看,while要比for在内存消耗上更优一些