1. 程式人生 > >【Leetcode】 74. 搜尋二維矩陣

【Leetcode】 74. 搜尋二維矩陣

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

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

示例 1:

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

示例 2:

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

在已排好序的陣列中找一個數,找到則返回true,否則返回false,這是一道明顯的二分查詢的題目!初始左邊界left=0,右邊界為陣列的總個數right=matrixRowSize*matrixColSize,mid定位二維陣列中的某個值可以使用除法以及求餘得到行列數,即行i=mid/matrixColSize,列=mid%matrixColSize。只要釐清這些,二分查詢二維陣列便也不難了!

此外,有幾個特殊情況需要注意一下:

  1. 空陣列直接返回false;
  2. 陣列中只有1個數,直接比較後返回true/false。

程式碼如下:

bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
    if(!matrixRowSize){//特殊情況1
        return false;
    }
    if(matrix[0][0]==target){//特殊情況2
        return true;
    }
    int left=0,right=matrixRowSize*matrixColSize,mid;
    while(left+1<right){
        mid=(left+right)/2;
        int temp=matrix[mid/matrixColSize][mid%matrixColSize];
        if(temp<target){
            left=mid;
        }
        else if(temp>target){
            right=mid;
        }
        else{
            return true;
        }
    }
    return false;
}