問題描述
在乙個二維整數陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,
輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
引數說明
int array:二維陣列
target:整數
存在返回true,否則返回false
暴力直接遍歷整個二維陣列不做解釋
public boolean find1(int array, int target)
}} return false;
}
二分法對於有序的陣列,二分法無疑是最優的演算法。將每一行的元素使用二分法查詢元素。
// 將每一行的元素進行二分查詢
public boolean find2(int array, int target)
} return false;
}
左下角元素開始遍歷將每一列視為整體,每一列中最大的元素為最下面的乙個。所以我們只需比較每一列的最大的元素,當小於這個元素時,向上用二分法查詢這一列的元素。
// 從左下角開始遍歷,元素大於target時向上遍歷,小於則向右遍歷
public boolean find3(int array, int target) else if (array[len][i] < target) else
} return false;
}
分模組二分+遞迴查詢而且這樣的矩陣有個性質,最左上角的元素必定是最小值,最右下角的是最大值,在乙個
nn的矩陣中,對角線的元素也是排好序的,找到對角線上的乙個元素,使得這個元素小於
待查詢的key,並且下一元素大於待查詢的key,那麼只要在這個元素的左下角矩陣和右上角
矩陣遞迴繼續對角線查詢就可以了,例如上圖例子裡查詢7,只要找到對角線的元素4,然後
遞迴查詢紅圈的矩陣就可以了,
矩陣最小值10>7,無需查詢了,但是此題並沒有告訴我們原始矩陣是nn的,這是比較麻煩的
地方,不過思路是一樣的,無非不能用對角線查詢這樣簡單的辦法了,假設m*n的矩陣,對角線
查詢的辦法改進為i = (m1+m2)/2,j = (n1+n2)/2 進行查詢就可以了,(m1,n1)為矩陣最左上角
元素下標,(m2,n2)為最右下角元素下標
假設查詢17,第一次比較10,然後比較25,然後比較13,返回元素13,這時候再遞迴查詢13
左下角的矩陣和右上角的矩陣就可以了(紅色橢圓部分);如果是查詢9,第一次比較10,然後比較4,
然後比較6,返回元素6,這時候遞迴查詢6左下角的矩陣和右上角矩陣(綠色橢圓部分)。
在查詢有序二維陣列中查詢元素
解題思路 實現 public class sortedmatrixelementfinder return true private static class sortedmatrix public void excludethisrow public boolean islegalindex pu...
有序二維陣列的查詢
劍指offer原題,陣列從左到右,從上到下遞增,給定乙個數target找出這個數是否在該有序二維陣列裡面。找到的話返true,否則返回false。題目比較簡單就簡單說說思路,利用二維陣列的特性,我們把陣列看做乙個矩陣,從矩陣的右上角元素a i,j 開始找,如果a i,j target,則target...
3 在有序二維陣列中查詢元素
題目描述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。解析 由於每一行是遞增的,每一列是遞增的,當遇到行列均有序時,除了考慮從左上角開始遍歷時,應該有從右上或者左下開始遍歷的新思...