leetcode240搜索二维矩阵2

leetcode240 Search a 2D MatrixII

Posted by BY on August 22, 2018

前言

真菜的我。

正文

问题来源

本问题来自leetcode上的240题。用go语言做的

问题描述

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

每行的元素从左到右升序排列。 每列的元素从上到下升序排列。

示例 :

输入:
[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]
若给定 target = 5,返回 true。
若给定 target = 20,返回 false。

分析:

本人的想法是采用逐行二分搜索来查找。 本人写的Go代码如下:

func binary_search(array []int,target int) bool {
	l := len(array)
	left, right := 0, l-1
	mid := (left+right) / 2
	if 0 == l {
		return false
	}
	for ;left <= right ; mid = (left+right)/2 {
		cur := array[mid]
		if cur == target {
			return true
		} else if cur > target {
			right = mid - 1
		} else {
			left = mid + 1
		}
	}
	return false
}
func searchMatrix(matrix [][]int, target int) bool {
	l := len(matrix)
	if 0 == l {
		return false
	}
	for i := 0; i < l; i++ {
		if binary_search(matrix[i], target) {
			return true
		}
	}
	return false
}

这题的思路很简单,利用矩阵行列分别有序的性质,我们从第0行的最右端开始搜索,两种情况:

  1. 如果当前的数比target大,则说明target必然在target的左边,则搜索其左边的位置
  2. 如果当前的数比target小,则说明和target相等的数必然不在这一行,因此往下一行搜索。
  3. 如果当前的数和target相等,则说明找到了这个target
func searchMatrix(matrix [][]int, target int) bool {
    n := len(matrix)
    if n <= 0 {
        return false
    }
    m := len(matrix[0])
    if m <= 0 {
        return false
    }
    for i, j := 0, m - 1; i < n && j >= 0; {
        num := matrix[i][j]
        if num == target {
            return true
        } else if num < target {
            i++
        } else {
            j--
        }
    }
    return false
}

总结:

勤思考

结语

不管怎么样好好加油。