剑指offer:二维数组中的查找
目錄
- 題目
- 解題思路
- 具體代碼
題目
題目鏈接
劍指offer:二維數組中的查找
題目描述
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
解題思路
這題解題的關鍵在于數據是有序的,很自然的便想到使用二分法;在提交后在評論區發現了更優的解法(除了數據有序外,利用了數據按矩陣形式排列這一特點),會在下列代碼中給出。
在使用二分法時,值得注意的是,不能將二維數組中所有元素看作單調遞增排列的一維數組,從而對所有元素整體進行二分。題目僅說明數據在矩陣的每行每列各自具單調遞增的性質;而行(或列)之間并沒有確定的大小關系。例如,第一行可能是[4, 5, 6], 而第二行為[1, 2, 3],第二行元素可能小于第一行元素。
具體代碼
1. 二分法
因為只能逐行進行二分,故算法時間復雜度為O(nlogm),n為矩陣行數,m為列數。
計算二分的中值mid時,推薦使用mid = (right - left) / 2 + left而不是mid = (left + right) / 2 ,這樣能夠避免加法溢出
2. 利用元素特殊的排列
利用元素排列的性質,對于左下角的元素來說,其同列上方的元素一定是小于它,其同行右方的元素一定是大于它;能夠在推導的過程中跳過更多的錯誤元素。易知,算法時間復雜度為O(n+m)
轉載于:https://www.cnblogs.com/Bylight/p/10440681.html
總結
以上是生活随笔為你收集整理的剑指offer:二维数组中的查找的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: react 动态修改路由_reactjs
- 下一篇: Metal日记:使用步骤指南