https://leetcode-cn.com/problems/search-a-2d-matrix/

    1. class Solution {
    2. public boolean searchMatrix(int[][] matrix, int target) {
    3. // 既然二维数组已经排好序,将其变化为一维,就是排好序的一维数组
    4. // 再用二分查找,下标对应关系:idx = row * n + col
    5. if (matrix == null) {
    6. return false;
    7. }
    8. // 所以先定义出 m 和 n
    9. int m = matrix.length;
    10. int n = matrix[0].length;
    11. if (target < matrix[0][0] || target > matrix[m-1][n-1]) {
    12. return false;
    13. }
    14. // 二分,定义左右指针
    15. int left = 0;
    16. int right = m * n - 1;
    17. while (left <= right) {
    18. // 计算中间位置
    19. int mid = left + (right - left) / 2;
    20. // 一维展开无法直接取到,要计算其下标
    21. int midElement = matrix[mid / n][mid % n];
    22. if (target < midElement) {
    23. right = mid - 1;
    24. } else if (target > midElement) {
    25. left = mid + 1;
    26. } else {
    27. return true;
    28. }
    29. }
    30. return false;
    31. }
    32. }
    1. class Solution {
    2. public boolean searchMatrix(int[][] matrix, int target) {
    3. if (matrix == null) {
    4. return false;
    5. }
    6. int n1 = matrix.length;
    7. int n2 = matrix[0].length;
    8. if (target < matrix[0][0] || target > matrix[n1 - 1][n2 - 1]) {
    9. return false;
    10. }
    11. int left = 0, right = n1 * n2 - 1;
    12. while (left <= right) {
    13. int mid = left + (right - left) / 2;
    14. int midNum = matrix[mid / n2][mid % n2];
    15. if (target < midNum) {
    16. right = mid - 1;
    17. } else if (target > midNum) {
    18. left = mid + 1;
    19. } else {
    20. return true;
    21. }
    22. }
    23. return false;
    24. }
    25. }