剑指 Offer 04. 二维数组中的查找

image.png

暴力搜索

  1. var findNumberIn2DArray = function(matrix, target) {
  2. let rowLen = matrix.length;
  3. if (rowLen === 0) return false;
  4. let colLen = matrix[0].length;
  5. // 遍历每一行
  6. for (let i = 0; i < rowLen; i++) {
  7. // 如果 target 在当前行,才会遍历当前行
  8. if (target >= matrix[i][0] && target <= matrix[i][colLen - 1]) {
  9. for (let j = 0; j < matrix[i].length; j++) {
  10. if (matrix[i][j] === target) return true;
  11. }
  12. }
  13. }
  14. return false;
  15. };

把矩阵逆时针旋转 45°

发现其结构类似 二分搜索树

图片转自 https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5vl81e/

剑指 Offer 04. 二维数组中的查找 - 图2

  1. public boolean findNumberIn2DArray(int[][] matrix, int target) {
  2. // 总行数
  3. int rowCount = matrix.length;
  4. // 如果总行数为 0
  5. if (rowCount == 0) return false;
  6. // 总列数
  7. int colCount = matrix[0].length;
  8. // 定义顶点坐标,在右上角
  9. int i = 0;
  10. int j = colCount - 1;
  11. // 如果没有越界,因为 i 只会递增,j 只会递减,所以只需要判断一边
  12. while (i < rowCount && j >= 0) {
  13. // 为了方便对比,用临时变量存储当前节点值
  14. int temp = matrix[i][j];
  15. // 如果匹配了,返回 true
  16. if (temp == target) return true;
  17. // 往树的右边移动
  18. else if (temp < target) i ++;
  19. // 往树的左边移动
  20. else j --;
  21. }
  22. return false;
  23. }