二维数组的二分搜索

二维数组的二分搜索

问题

这个题目说的是,给你一个二维数组 matrix,和一个目标值 target。你要在数组里找到这个目标值,然后返回它的行/列下标。如果找不到,则返回 [-1,-1]。

这个数组的每一行都是递增的,并且每一行的第一个数都比上一行的最后一个数要大。也就是,这个数组可以看成,从左到右、从上到下,呈 Z 字形递增。

比如说,给你的二维数组是:

1, 3, 5
7, 9, 11

给你的目标值是 9。9 在这个数组中,找到后返回它的下标 [1, 1] 即可。

如果给你的目标值是 100。显然它不在这个二维数组中,你要返回 [-1,-1]。

代码

public class AlgoCasts {

  // Time: O(log(m*n)), Space: O(1)
  public int[] binarySearchIn2DArray(int[][] matrix, int target) {
    if (matrix == null || matrix.length == 0 ||
      matrix[0] == null || matrix[0].length == 0)
      return new int[]{-1, -1};

    int m = matrix.length, n = matrix[0].length;
    int low = 0, high = m * n - 1;
    while (low <= high) {
      int mid = low + (high - low) / 2;
      int r = mid / n, c = mid % n;
      if (target < matrix[r][c]) high = mid - 1;
      else if (target > matrix[r][c]) low = mid + 1;
      else return new int[]{r, c};
    }
    return new int[]{-1, -1};
  }

}

  转载请注明: ForwardXu 二维数组的二分搜索

 上一篇
数组的下一个排列 数组的下一个排列
数组的下一个排列问题 这个题目说的是,给你一个整数数组,每一个元素是一个 0 到 9 的整数,数组的排列形成了一个有效的数字。你要找到数组的下一个排列,使它形成的数字是大于当前排列的第一个数字。如果当前排列表示的已经是最大数字,则返回这个数
2019-01-06
下一篇 
求和为给定值的组合 求和为给定值的组合
求和为给定值的组合问题 这个题目说的是,给你一个正整数数组,数组中不包含重复元素,同时给你一个正整数目标值,你要找到数组中和为目标值的所有组合。另外,数组中每个元素都可以使用无限多次,并且答案中不能包含重复组合。 比如说,给你的数组是:
2019-01-06
  目录