题目描述:

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例:

现有矩阵 matrix 如下:

[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。

给定 target = 20,返回 false。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof

知识点:

  • 这道题有点类似于二分搜索的理念,选定一个边界的退出值然后不断的循环判断,根据和目标值的比较来确定下一次移动指针到哪里

解题思路:

  • 这道题给我们一个行和列都递增的数组,让我们查找在数组中是否存在一个数
  • 我们可以借用这个数组的特性来查找

二维数组查找.png

  • 假设我们要查找的元素为23,我们首先在数组的右上角开始查找
  • 我们可以发现如果右上角的元素小于目标元素那么第一行所有的元素都小于目标元素
  • 那么我们让y+1开始在第二行查找,如果第二行的第一个元素还是小于,那么我们再让y+1直到找到大于目标元素时,我们再让x-1开始在某一行内查找
  • 直到找到返回true,否则返回false

解题代码:

  1. function Find(target, array)
  2. {
  3. // write code here
  4. let x = array.length - 1;
  5. let y = 0;
  6. while(x >= 0 && y < array[0].length) {
  7. if(array[x][y] === target) {
  8. return true
  9. }else if(array[x][y] < target) {
  10. y++
  11. }else if(array[x][y] > target) {
  12. x--;
  13. }
  14. }
  15. return false;
  16. }