在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
由題目可知,這個題目有2個天然順序,也就是從左到右是遞增的,從上到下是遞增的。由資訊熵理論也可以知道,這條資訊的資訊熵並不大,因為我們需要的是有辨別度的資訊,也就是說,如果數目大了會去哪,數目小了會去哪,這樣我們才能夠逐步縮小我們的搜尋範圍。因此,如果題目這樣描述,從左到右是遞增的,從下到上是遞減的,那麼我們很容易得出從左下角往右上角進行比較。
當然,如果使用暴力求解的話,其實時間複雜度也並不大,比如逐行使用二分檢索,如果假定這個矩陣實nm的話,那麼時間複雜度為o(nlogm),我們下面給出**:
public boolean find(int target,int array)
else
}return false;
}當然,還有說上面那種並非是最優解,下面這種思路才是,通過行列二分的手段,找到二維陣列中近似的中位數,然後再比較與中位數的大小,如果比近似中位數大,則分別在近似中位數的下邊,右下和右邊3塊區域遞迴查詢,否則在其左邊,左上和上面3塊區域遞迴查詢,時間複雜度在o(log4(n?m)),應該會好一些。**如下所示:
public static boolean find(int target, int array, int rfront, int cfront, int rend, int cend)
int rmid = (rfront+rend)/2;
int cmid = (cfront+cend)/2;
if(target == array[rmid][cmid])
else if(target > array[rmid][cmid])
}else
}return false;
}public static boolean find3(int target, int array)
return find(target, array, 0, 0, array.length-1, array[0].length-1);
}但是這裡忽略了乙個重要的問題,那就是這個二維陣列是不是矩陣,也就是說是不是每行都一樣長,如果不一樣長的話,則只有第一種遍歷每行二分查詢還有用了,其他的都沒有用了。下面提供第二種的非矩陣的演算法:
public boolean find2(int target, int array)
return false;
}這樣,我們這道二維陣列中的查詢就算解答完畢了,事實上,這道題還是可以使用字串匹配的方式來做的,這裡除了我了解了j**a自帶的contains是多麼強大外,另外也知道了很多種字串匹配的方法,有關內容將會在後面的文章中給出,例如我們最常見的樸素查詢、kmp演算法,還有像bm演算法,horspool演算法和sunday演算法等,以及ac自動機演算法都是非常優秀的演算法。今天就到這裡了!下次見!
劍指offer 二維陣列中查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和一 個整數,判斷陣列中是否含有該整數。public class solution 因為陣列每一行都按照從左到右遞增的順序排序,每一列都按照從上到下...
劍指offer 二維陣列中查詢
從今天開始每天一題,除了節假日。在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution return false class solut...
劍指offer 二維陣列中查詢
要求如下 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數 示例如下 7,1,2,8,9 2,4,9,12 4,7,10,13 6,8,11,15 思路有三種,...