LeetCode-剑指 Offer 04. 二维数组中的查找
生活随笔
收集整理的這篇文章主要介紹了
LeetCode-剑指 Offer 04. 二维数组中的查找
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
劍指 Offer 04. 二維數組中的查找
思路一:暴力解法,兩層for循環查找
時間復雜度為:O(nm)
空間復雜度為:O(1)
class Solution { public:bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {if(matrix.empty()) return false;int n = matrix.size(); //行數int m = matrix[0].size(); //列數for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(matrix[i][j]==target){return true;}}}return false;} };思路二:如下圖所示,我們將矩陣逆時針旋轉 45° ,并將其轉化為圖形式,發現其類似于 二叉搜索樹 ,即對于每個元素,其左分支元素更小、右分支元素更大。因此,通過從 “根節點” 開始搜索,遇到比 target 大的元素就向左,反之向右,即可找到目標值 target 。
“根節點” 對應的是矩陣的 “左下角” 和 “右上角” 元素,本文稱之為 標志數 ,以 matrix 中的 左下角元素 為標志數 flag ,則有:
若 flag > target ,則 target 一定在 flag 所在 行的上方 ,即 flag 所在行可被消去。
若 flag < target ,則 target 一定在 flag 所在 列的右方 ,即 flag 所在列可被消去。
算法流程:
從矩陣 matrix 左下角元素(索引設為 (i, j) )開始遍歷,并與目標值對比:
- 當 matrix[i][j]> target 時,執行 i-- ,即消去第 i 行元素;
- 當 matrix[i][j] < target 時,執行 j++ ,即消去第 j 列元素;
- 當 matrix[i][j] = target 時,返回 truetrue ,代表找到目標值
2.若行索引或列索引越界,則代表矩陣中無目標值,返回 false 。
- 每輪 i 或 j 移動后,相當于生成了“消去一行(列)的新矩陣”, 索引(i,j) 指向新矩陣的左下角元素(標志數),因此可重復使用以上性質消去行(列)。
總結
以上是生活随笔為你收集整理的LeetCode-剑指 Offer 04. 二维数组中的查找的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode-剑指 Offer 03
- 下一篇: LeetCode-剑指 Offer 11