在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var findNumberIn2DArray = function(matrix, target) {
if (matrix.length === 0) return false
// 解法一 遍历主数组 再通过indexOf查找子数组
for (let i = 0; i < matrix.length; i++) { // 80ms
const arr = matrix[i]
if (arr.indexOf(target) > -1) {
return true
}
if (i === matrix.length - 1 && arr.indexOf(target) === -1) {
return false
}
}
// 解法二 直接将数组打平成一维数组 再通过indexOf查找是否有这个数字
const newMatrix = matrix.flat()
if (newMatrix.indexOf(target) > -1) return true // 104ms
return false
};
Array.prototype.flat
const arr = [1, [2, 3, [ 4, 5, [6, 7, 8]]]]
const target = arr.flat(Infinity)
console.log(target) // [1, 2, 3, 4, 5, 6, 7, 8]
Array.prototype.flatMap
const arr = [1,2,3,4]
const target = arr.flatMap((cur, index, array) => {
return [cur * 2]
})
console.log(target) // [2, 4, 6, 8]
flatMap VS map
const arr = [...new Array(100000).keys()]
const startTime = Date.now()
const target = arr.flatMap((cur, index, array) => {
return [cur * 2]
})
console.log(Date.now() - startTime) // 37
const arr = [...new Array(100000).keys()]
const startTime = Date.now()
const target = arr.map((cur, index) => {
return cur * 2
})
console.log(Date.now() - startTime) // 3