1. 程式人生 > >Leetcode 74. 搜尋二維矩陣 C++ 二分查詢

Leetcode 74. 搜尋二維矩陣 C++ 二分查詢

 本題一看就知道要用二分法,而且是排序好的。只不過需要用兩次而已。

二分法的思想本身不難,但是我自己在使用的時候,常常因為邊界條件而出錯,在網上找到兩篇很不錯的帖子,專門講二分法的邊界問題。

文章地址:(其中一篇是轉載,其實是一篇)

 bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if(matrix.size()==0 || matrix[0].size()==0) return false;
        decltype(matrix.size()) row_front=0,c_front=0,row_back=matrix.size(),c_back=matrix[0].size();
        while(row_front<row_back)
        {
            auto k=row_front+(row_back-row_front)/2;
            if(matrix[k][0]==target)
            {
                return true;
            }
            else if(matrix[k][0]<target)
            {
                row_front=k+1;
            }
            else if(matrix[k][0]>target)
            {
                row_back=k;
            }
        }
        /*此處之所以會有這樣一條語句判斷語句存在,是為了處理當target小於所有元素,那麼最後前後指標都將只向0,而目標位置要減一,此時就超出邊界了
        這樣明顯是錯誤的,例如矩陣只包含一個元素1,而target的值為0,那麼會導致錯誤
        注意,此處我把型別申明為了decltype(matrix.size())型的,這是一個size_type型的,是非負的,所以此處的判斷要在這裡進行,不可以用row-1<0來判斷
        */
        if(row_front==0)
        {
            return false;
        }
        decltype(matrix.size()) target_line=row_front-1;
        while(c_front<c_back)
        {
            auto j=c_front+(c_back-c_front)/2;
            if(matrix[target_line][j]==target)
            {
                return true;
            }
            else if(matrix[target_line][j]<target)
            {
                c_front=j+1;
            }
            else if(matrix[target_line][j]>target)
            {
                c_back=j;
            }
        }
        return false;
        
    }
};
/*本題有一個很重要的東西,那就是關於使用二分法的邊界問題。在本題中,我自己已經處理得相對不錯。
無論是前閉後閉區間,還是前閉後開區間,那麼迴圈判斷和賦值的地方要保持一致*/