有序二維陣列查詢元素的幾種方式

2021-09-26 03:45:03 字數 1626 閱讀 8261

問題描述

在乙個二維整數陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,

輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

引數說明

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 在有序二維陣列中查詢元素

題目描述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。解析 由於每一行是遞增的,每一列是遞增的,當遇到行列均有序時,除了考慮從左上角開始遍歷時,應該有從右上或者左下開始遍歷的新思...