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
total−temp−sum[i]=temp,等价于
t
o
t
a
l
=
2
∗
t
e
m
p
+
s
u
m
[
i
]
total = 2*temp + sum[i]
total=2∗temp+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)
- 应用:
-
求数组各项之和(代码如上)
-
求数组最大/最小值
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); //使用箭头函数写。
-
数组去重
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; }, []);
-
求字符串中字母出现的次数
var str = "sfhjasfjgfasjuwqrqadqeiqsajsdaiwqdaklldflas-cmxzmnha"; var res = str.split("").reduce((counter, cur) => { counter[cur] = counter[cur] ? counter[cur] + 1 : 1; return counter; }, []);
-
数组转数组(进行一些操作)
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; }, []);