LeetCode 74. Search a 2D Matrix (C++ JavaScript)

題目描述
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

•Integers in each row are sorted from left to right.
•The first integer of each row is greater than the last integer of the previous row.

For example,
Consider the following matrix:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
Given target = 3, return true.
解題思路:本題就是在一個已經排序的數組中查找給定的值,首先想到的是暴力查找,其次尋求較高效率的算法是二分查找。
解法一:順序搜索,時間複雜度爲O(m*n)。用二重循環遍歷整個數組,親試可以通過。

//C++
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        for(int i=0;i<matrix.size();i++)
            for(int j=0;j<matrix[i].size();j++)
                if(matrix[i][j]==target)return true;
        return false;
    }
};
//JavaScript
/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var searchMatrix = function(matrix, target) {
    for(var i=0;i<matrix.length;i++)
    {
        for(var j=0;j<matrix[i].length;j++)
        {
            if(matrix[i][j]==target) return true;
        }
    }
    return false;
};

解法二:二分查找,時間複雜度爲O(log(n+m))

  • 二分查找基本思想就是在一個有序數列中,用序列中間的值與待查找的值進行比較,如果該值比爲待查找的值,則成功返回;如果該值小於待查找的值,說明待查找的值在整個序列的後半部分,令序列的low值爲中間值的右側的值;如果該值大於待查找值,說明待查找的值在整個序列的前半部分,令序列的high值爲中間值左側的值;如果low值大於high則查找結束。
  • 二分查找有遞歸和非遞歸算法,本例中用的是非遞歸算法。
  • 在本例中二位數組是一個已經排序的數列,用二分查找時候需要對數列中的元素的個數標號和數組的下標進行轉換。數組的行數爲嗎,列數爲n,數組的下標從0開始,數組中matrx[i][j]在數列中的位置爲k,則有如下關係:
    k=i*n+j
    i=k/n
    j=k%n
  • 其他注意事項見代碼註釋。
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {

        int m=matrix.size();
        int n=matrix[0].size();
        int low=0;
        int high=m*n-1;
        int mid;

        while(low<=high)//此處一定要有等號,否則會出錯(一個數),或者死循環(兩個數)
        {
            mid=(low+high)/2;//用除法而不是取模運算
            if(matrix[mid/n][mid%n]==target) return true;
            else if(matrix[mid/n][mid%n]<target) low=mid+1;//一定要加1
            else high=mid-1;//一定要減1
        }
        return false;
    }
};
//JavaScript
/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var searchMatrix = function(matrix, target) {
    var m= matrix.length;
    var n=matrix[0].length;
    var low=0;
    var high=m*n-1;
    var mid;//此處可以不聲明mid,下面也可以直接使用
    while(low<=high)
    {
        //JavaScript是若類型,需要用parseInt(String,radix)轉爲整數。
        mid=parseInt((low+high)/2);
        if((matrix[parseInt(mid/n)][parseInt(mid%n)]==target))return true;
        else if(matrix[parseInt(mid/n)][parseInt(mid%n)]<target) low=++mid;
        else high=--mid;
    }
    return false;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章