1. 概述

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。

2. 解题

```php <?php class Solution {

  1. /**
  2. * @param Integer[][] $matrix
  3. * @param Integer $target
  4. * @return Boolean
  5. */
  6. public function searchMatrix($matrix, $target) {
  7. if (!$matrix) return false;
  8. // 纵向二分
  9. $row = -1;
  10. $top = 0;
  11. $bottom = count($matrix) - 1;
  12. while ($top <= $bottom) {
  13. $verticalMid = $top + floor(($bottom - $top) / 2);
  14. if ($matrix[$verticalMid][0] == $target) {
  15. return true;
  16. } elseif ($matrix[$verticalMid][0] > $target) {
  17. $bottom = $verticalMid - 1;
  18. } else {
  19. if (!isset($matrix[$verticalMid + 1])) {
  20. $row = $verticalMid;
  21. break;
  22. }
  23. if ($matrix[$verticalMid + 1][0] > $target) {
  24. $row = $verticalMid;
  25. break;
  26. }
  27. $top = $verticalMid + 1;
  28. }
  29. }
  30. if ($row == -1) {
  31. return false;
  32. }
  33. // 横向二分
  34. $left = 0;
  35. $right = count($matrix[$row]) - 1;
  36. while ($left <= $right) {
  37. $horizontalMid = $left + floor(($right - $left) / 2);
  38. if ($matrix[$row][$horizontalMid] == $target) {
  39. return true;
  40. } elseif ($matrix[$row][$horizontalMid] < $target) {
  41. $left = $horizontalMid + 1;
  42. } else {
  43. $right = $horizontalMid - 1;
  44. }
  45. }
  46. return false;
  47. }

} $matrix = [ [1,3,5,7], [10,11,16,20], [23,30,34,50] ]; $target = 3; $cls = new Solution(); $r = $cls->searchMatrix($matrix, $target); var_dump($r); ```