240.search-a-2d-matrix-ii.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. func searchMatrix(matrix [][]int, target int) bool {
  2. yEnd := len(matrix)
  3. if yEnd == 0 {
  4. return false
  5. }
  6. xEnd := len(matrix[0])
  7. return searchPartOf(matrix, 0, xEnd, 0, yEnd, target)
  8. }
  9. func searchPartOf(matrix [][]int, xBeg, xEnd, yBeg, yEnd, target int) bool {
  10. m, n := yEnd-yBeg, xEnd-xBeg
  11. if m == 0 || n == 0 {
  12. return false
  13. }
  14. if m == 1 { // If m is 1 or n is 1, fall back to binary search.
  15. beg, end := xBeg, xEnd
  16. for beg < end {
  17. mid := beg + (end-beg)/2
  18. if matrix[yBeg][mid] < target {
  19. beg = mid + 1
  20. } else if target < matrix[yBeg][mid] {
  21. end = mid
  22. } else {
  23. return true
  24. }
  25. }
  26. return false
  27. } else if n == 1 {
  28. beg, end := yBeg, yEnd
  29. for beg < end {
  30. mid := beg + (end-beg)/2
  31. if matrix[mid][xBeg] < target {
  32. beg = mid + 1
  33. } else if target < matrix[mid][xBeg] {
  34. end = mid
  35. } else {
  36. return true
  37. }
  38. }
  39. return false
  40. }
  41. if target < matrix[yBeg][xBeg] || matrix[yEnd-1][xEnd-1] < target {
  42. return false
  43. }
  44. xMid, yMid := xBeg+(xEnd-xBeg)/2, yBeg+(yEnd-yBeg)/2
  45. return searchPartOf(matrix, xBeg, xMid, yBeg, yMid, target) || // Split the whole matrix into 4 parts.
  46. searchPartOf(matrix, xMid, xEnd, yBeg, yMid, target) ||
  47. searchPartOf(matrix, xBeg, xMid, yMid, yEnd, target) ||
  48. searchPartOf(matrix, xMid, xEnd, yMid, yEnd, target)
  49. }