二维有序数组查找问题

137 阅读1分钟
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,
每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如: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))