給乙個行和列都排好序的n*m矩陣,判斷乙個數是否存在於矩陣中,要求時間複雜度o(n+m),空間複雜度o(1)。
遍歷肯定太慢了,看到在矩陣中找,就聯想到利用有序矩陣的性質一次否決掉一批元素。因為行和列都是有序的,所以對於矩陣中的每乙個元素,同一行左面/同一列上面所有的元素都小於等於它,同一列下面/同一行右面所有的元素都大於等於它,所以每次把乙個元素x和給定值a進行比較,都可以否決掉x同一行或者同一列乙個方向上所有的元素,然後移動指標位置,把下乙個元素拿來比較。
如果在乙個時刻拿來比較的x不能否決掉被否決行列上所有的剩餘元素,這個演算法的就沒法單調向乙個方向行進。如果x在剩下的矩陣的邊上,那麼每次都可以否決掉被否決行列上所有的剩餘元素,x和a比較時,有相等、大於、小於三種可能,相等就返回true不用多說,在查詢時要兼顧大於小於的情況,
所以,選取右上角或者左下角,每次比較的時候,這一行/列上所有其他元素都位於x的一側,所以每次都能,演算法可以單調行進。
這樣解決思路就有了。以左上角為例,每次比較,如果x大於a,x下面所有元素排除,指標向左走一格;小於a,x左側所有元素排除,指標向右走一格。每次比較之後,矩陣的剩餘部分都還是乙個矩陣,而指標指向剩下的矩陣左上角的元素。直到找到元素返回true,或者走不動了返回false。
public boolean isinmatrix(int m, int n) else if(m[row][col] < n) else
} return false;
}
JAVA語言之有序矩陣查詢
現在有乙個行和列都排好序的矩陣,請設計乙個高效演算法,快速查詢矩陣中是否含有值x。給定乙個int矩陣mat,同時給定矩陣大小nxm及待查詢的數x,請返回乙個bool值,代表矩陣中是否存在x。所有矩陣中數字及x均為int範圍內整數。保證n和m均小於等於1000。測試樣例 1,2,3 4,5,6 7,8...
資料結構演算法題 有序矩陣查詢
在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,誒一列都按照從上到下遞增的順序排序,請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否包含了該整數。例如下面的二維陣列就是每行 沒列都遞增排序。如果在這個陣列中查詢數字7,則返回true 找得到 如果查詢數字5,由於陣列不含該數字,...
面試題3 有序矩陣中查詢數字
題目描述 在乙個二維陣列中,每行數字從左到右遞增,每列數字從上到下遞增,給定乙個整數,判斷該數是否存在於二位陣列之中.解決方法 我們可以從右上角開始 如果該數恰好等於要查詢的數,則返回true.如果該數小於要查詢的數,說明這一行的數都小於要查詢的數,於是刪除第一行繼續查詢.如果該數大於要查詢的數,說...