leetcode240搜索二维矩阵II

leetcode240 Search a 2D Matrix II

Posted by BY on May 31, 2019

前言

新的一年,好好学习。

正文

问题来源

本问题来自leetcode上的240题。

问题描述

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

示例 1:

[
  [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。

分析:

每一行二分

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
}

从matrix的右上角向左向右查找

func countSubstrings(s string) int {
    ans := 0
    for i := 0; i < len(s); i++ {
        for j := 0; (i-j>=0)&&(i+j<len(s))&&(s[i-j]==s[i+j]); j++ {
            ans++
        }
        for j := 0; (i-j-1>=0)&&(i+j<len(s))&&(s[i-j-1]==s[i+j]); j++ {
            ans++
        }
    }
    return ans
}

将矩阵分成四份,二分查找

func searchMatrix(matrix [][]int, target int) bool {
    return (len(matrix) > 0) && binarySearch2D(matrix, target, 0, 0, len(matrix)-1, len(matrix[0])-1)
}

func binarySearch2D(M [][]int, T int, top, left, bottom, right int) bool {
    m, c := (top+bottom)/2, (left+right)/2
    switch {
    case top > bottom || left > right:
    case M[m][c] == T:
        return true
    case M[m][c] < T:
        return binarySearch2D(M, T, m+1, left, bottom, c) ||
            binarySearch2D(M, T, top, c+1, bottom, right)
    case M[m][c] > T:
        return binarySearch2D(M, T, top, left, bottom, c-1) ||
            binarySearch2D(M, T, top, c, m-1, right)
    default:
    }

    return false
}

总结:

勤思考。

结语

不管怎么样好好加油。