题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,
每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如:let arr = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
*/
const arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
// 方法一:先将二维数组扁平化为一维数组,再通过二分查找判断数组中是否存在该值
function findVal(arr, val) {
const flatArr = arr.flat()
return binarySearch(flatArr, val, 0, flatArr.length - 1)
}
function binarySearch(arr, val, start, end) {
if (start > end) {
return false
}
const mid = Math.floor((start + end) / 2)
if (val === arr[mid]) {
return true
} else if (val > arr[mid]) {
return binarySearch(arr, val, mid + 1, end)
} else {
return binarySearch(arr, val, start, mid - 1)
}
}
console.log(findVal(arr, 18))
/*
方法二:将二维数组看作平面坐标系
从左下角(0,arr.length-1)开始比较:
目标值大于坐标值---y+1
目标值小于坐标值---x-1
*/
// const arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
function findTarget(arr, val) {
return recursionFind(arr, val, arr.length - 1, 0)
}
function recursionFind(arr, val, x, y) {
if (!arr[x] || !arr[x][y]) {
return false
}
const temp = arr[x][y]
if (temp === val) {
return true
} else if (temp > val) {
return recursionFind(arr, val, x - 1, y)
} else {
return recursionFind(arr, val, x, y + 1)
}
}
console.log(findTarget(arr, 1))