| 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)}
 |