leetcode724.寻找数组的中心下标 总结reduce()用法

leetcode LeetBook 数组和字符串 724. 寻找数组的中心下标 总结reduce()用法

我的思路

遍历 nums 中的每个元素,分别计算该元素左右两边元素的和,如果相等,那么返回该元素下标。如果遍历结束都没有找到,那么返回-1。
时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( 2 ) O(2) O(2)

/**
 * @param {number[]} nums
 * @return {number}
 */
var pivotIndex = function (nums) {
  for (let i = 0; i < nums.length; i++) {
    var left = 0;
    var right = 0;
    for (let j = 0; j < nums.length; j++) {
      if (j < i) {
        left += nums[j];
      } else if (j > i) {
        right += nums[j];
      }
    }
    if (left == right) {
      return i;
    }
  }
  return -1;
};

改进了一下下,使用了 total。每遍历到一个元素就减去这个元素,然后看是否与 temp 相等,temp 是记录目前元素左侧元素的和。
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 2 ) O(2) O(2)

var pivotIndex = function (nums) {
  var total = 0;
  for (i of nums) {
    total += Number(i);
  }
  var temp = 0;
  for (let i = 0; i < nums.length; i++) {
    total -= nums[i];
    if (temp == total) {
      return i;
    } else {
      temp += nums[i];
    }
  }
  return -1;
};

题解——前缀和

官方题解给出的解法,原来求 total 可以这样写,学到了! 官方题解用了一下下数学公式。 t o t a l − t e m p − s u m [ i ] = t e m p total-temp-sum[i] = temp totaltempsum[i]=temp,等价于 t o t a l = 2 ∗ t e m p + s u m [ i ] total = 2*temp + sum[i] total=2temp+sum[i].
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

var pivotIndex = function (nums) {
  const total = nums.reduce((a, b) => a + b, 0); //get nums sum
  let temp = 0;
  for (let i = 0; i < nums.length; i++) {
    if (2 * temp + nums[i] === total) {
      return i;
    }
    temp += nums[i];
  }
  return -1;
};

总结

学到了数组求和 reduce 方法:

var total = nums.reduce((a, b) => a + b, 0);

reduce()方法,接收一个函数作为累加器。返回计算结果。reduce()是数组的归并方法,与 forEach()、map()、filter()等迭代方法一样都会对数组每一项进行遍历,但是 reduce() 可同时将前面数组项遍历产生的结果与当前遍历项进行运算。

  • 语法:
array.reduce(function(total,curValue,curIndex,arr),initialValue)
  • 应用:
  1. 求数组各项之和(代码如上)

  2. 求数组最大/最小值

    var arr = [1, 7, 4, 3, 8, 2, 1, 5, 2, 7, 6];
    var max = arr.reduce(function (pre, cur) {
      return Math.max(pre, cur);
    });
    //由于未传入初始值,最开始pre的值为数组的第一项,cur为数组的第二项,取最大值后进行下一轮回调。
    var max = arr.reduce((pre, cur) => Math.max(pre, cur), 0); //使用箭头函数写。
    
  3. 数组去重
    pre 最开始是一个空数组,cur 表示需要去重的数组的每一项,当遍历到一个数就查询 pre 中有没有,没有就加入到 pre 中,有不做处理。最后返回 pre 数组即为结果。

    var arr = [1, 7, 4, 3, 8, 2, 1, 5, 2, 7, 6];
    var newArr = arr.reduce((pre, cur) => {
      if (!pre.includes(cur)) {
        return pre.concat(cur);
      } else {
        return pre;
      }
    }, []);
    
    var newArr = arr.reduce((pre, cur) => {
      pre.indexOf(cur) === -1 && pre.push(cur);
      return pre;
    }, []);
    
  4. 求字符串中字母出现的次数

    var str = "sfhjasfjgfasjuwqrqadqeiqsajsdaiwqdaklldflas-cmxzmnha";
    var res = str.split("").reduce((counter, cur) => {
      counter[cur] = counter[cur] ? counter[cur] + 1 : 1;
      return counter;
    }, []);
    
  5. 数组转数组(进行一些操作)

    var nums = [1, 7, 4, 3, 8, 2, 1, 5, 2, 7, 6]; //去重并求每个值的平方
    var ans = nums
      .reduce((pre, cur) => {
        pre.indexOf(cur) === -1 && pre.push(cur);
        return pre;
      }, [])
      .reduce((res, cur) => {
        res.push(cur * cur);
        return res;
      }, []);
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值