123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- func searchMatrix(matrix [][]int, target int) bool {
- yEnd := len(matrix)
- if yEnd == 0 {
- return false
- }
- xEnd := len(matrix[0])
- return searchPartOf(matrix, 0, xEnd, 0, yEnd, target)
- }
- func searchPartOf(matrix [][]int, xBeg, xEnd, yBeg, yEnd, target int) bool {
- m, n := yEnd-yBeg, xEnd-xBeg
- if m == 0 || n == 0 {
- return false
- }
- if m == 1 { // If m is 1 or n is 1, fall back to binary search.
- beg, end := xBeg, xEnd
- for beg < end {
- mid := beg + (end-beg)/2
- if matrix[yBeg][mid] < target {
- beg = mid + 1
- } else if target < matrix[yBeg][mid] {
- end = mid
- } else {
- return true
- }
- }
- return false
- } else if n == 1 {
- beg, end := yBeg, yEnd
- for beg < end {
- mid := beg + (end-beg)/2
- if matrix[mid][xBeg] < target {
- beg = mid + 1
- } else if target < matrix[mid][xBeg] {
- end = mid
- } else {
- return true
- }
- }
- return false
- }
- if target < matrix[yBeg][xBeg] || matrix[yEnd-1][xEnd-1] < target {
- return false
- }
- xMid, yMid := xBeg+(xEnd-xBeg)/2, yBeg+(yEnd-yBeg)/2
- return searchPartOf(matrix, xBeg, xMid, yBeg, yMid, target) || // Split the whole matrix into 4 parts.
- searchPartOf(matrix, xMid, xEnd, yBeg, yMid, target) ||
- searchPartOf(matrix, xBeg, xMid, yMid, yEnd, target) ||
- searchPartOf(matrix, xMid, xEnd, yMid, yEnd, target)
- }
|