Leetcode 74. 搜尋二維矩陣 C++ 二分查詢
阿新 • • 發佈:2018-12-16
本題一看就知道要用二分法,而且是排序好的。只不過需要用兩次而已。
二分法的思想本身不難,但是我自己在使用的時候,常常因為邊界條件而出錯,在網上找到兩篇很不錯的帖子,專門講二分法的邊界問題。
文章地址:(其中一篇是轉載,其實是一篇)
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; } }; /*本題有一個很重要的東西,那就是關於使用二分法的邊界問題。在本題中,我自己已經處理得相對不錯。 無論是前閉後閉區間,還是前閉後開區間,那麼迴圈判斷和賦值的地方要保持一致*/