【算法】搜索二維矩陣 暴力解法&二分法 4種語言

9b919b58d1f347d600821762d79817c7.jpg

編寫一個高效的算法來判斷 m x n 矩陣中,是否存在一個目標值。該矩陣具備以下特性:

每行中的整數從左到右按升序排列。
每行的第一個整數大於前一行的最後一個整數。javascript

示例 1:java

輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
輸出:true

示例 2:python

輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
輸出:false

提示:算法

m == matrix.length
    n == matrix[i].length
    1 <= m, n <= 100
    -104 <= matrix[i][j], target <= 104

javascript 暴力解法

/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
 var searchMatrix = function(matrix, target) {
    for(let i=0;i<matrix.length;i++){
        for(let j=0;j<matrix[0].length;j++){
            if(matrix[i][j]===target){
                return true
            }
        }
    }
    return false
};

javascript 數組查找

/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
/*
    以二維數組左下角爲原點,創建直角座標軸。
    若當前數字大於了查找數,查找往上移一位。
    若當前數字小於了查找數,查找往右移一位。
*/
 var searchMatrix = function(matrix, target) {
    let x = matrix.length-1,y = 0
    while(x>=0 && y<matrix[0].length){
        if(matrix[x][y]===target){
            return true
        }else if(matrix[x][y]>target){
            x--
        }else{
            y++
        }
    }
    return false
};

javascript 二分法

/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
 var searchMatrix = function(matrix, target) {
    let m = matrix.length,n=matrix[0].length
    let low = 0,high = m*n-1
    while(low<=high){
        let mid = Math.floor((high-low)/2)+low //中位
        let x = matrix[Math.floor(mid/n)][mid%n] //所在的值
        if(x<target){
            low = mid+1
        }else if(x>target){
            high = mid-1
        }else{
            return true
        }
    }
    return false
};

Typescript 以上兩種也能夠改成ts

function searchMatrix(matrix: number[][], target: number): boolean {
    let x: number = matrix.length - 1, y:number = 0
    while (x >= 0 && y < matrix[0].length) {
        if (matrix[x][y] === target) {
            return true
        } else if (matrix[x][y] > target) {
            x--
        } else {
            y++
        }
    }
    return false
};

python 暴力解法

class Solution(object):
     def searchMatrix(self, matrix, target):
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if matrix[i][j]==target:
                    return True
        return False

python any函數

any() 函數用於判斷給定的可迭代參數 iterable 是否所有爲 False,則返回 False,若是有一個爲 True,則返回 True。元素除了是 0、空、FALSE 外都算 TRUE。

語法

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

解法

class Solution(object):
     def searchMatrix(self, matrix, target):
        return any(target in row for row in matrix)

Go 數組查找

func searchMatrix(matrix [][]int, target int) bool {
    m := len(matrix)
    n := len(matrix[0])
    var i = 0
    for i < m && n > 0 {
        if target == matrix[i][n-1] {
            return true
        } else if target < matrix[i][n-1] {
            n--
        } else {
            i++
        }
    }
    return false
}
第一次嘗試用4種語言去解一道題目,繼續加油!
相關文章
相關標籤/搜索