剑指offer:面试题04. 二维数组中的查找
生活随笔
收集整理的這篇文章主要介紹了
剑指offer:面试题04. 二维数组中的查找
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:二維數組中的查找
在一個 n * m 的二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
示例:
現有矩陣 matrix 如下:
[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]
]
給定 target?=?5,返回?true,給定?target?=?20,返回?false。
限制:
0 <= n <= 10000 <= m <= 1000
解題思路:
首先選取二維數組當中右上角的數字。
- 如果該數字等于target,則查找過程結束;
- 如果該數字大于target,則剔除這個數字的所在列(由于該列是遞增順序,這個數字是這一列里的最小的數字,這一列的數字都會比target大);
- 如果該數字小于target,則剔除這個數字的所在行(同理,這個數字是這一行里最大的數字,所以這一行的數字都要比target小);
- 再次選取剩余區域的右上角的數字,然后重復上述的過程。
時間復雜度O(m+n)(其中 m?和 n 分別代表行數和列數),空間復雜度O(1)
class Solution {
public:bool findNumberIn2DArray(vector<vector<auto>>& matrix, auto target) {auto rows = matrix.size();auto columns = matrix[0].size();if(rows>0 && columns>0){ auto row = 0 ;auto column = columns-1;while(row<rows&&column>=0){if(matrix[row][column]==target) {return true;}else if(matrix[row][column]>target) {column--;}else row++;}}return false;}
};
LeetCode代碼提交報錯:
reference binding to null pointer of type 'struct value_type'
后來找到問題是,測試用例如果直接給出一個空字符串的話,也就是說函數傳進的是一個空的vector容器,那么在調用matrix[0]的時候就會下標越界,因為matrix[0]是不存在的。加上如下判斷條件之后,順利通過。
if(matrix.empty()) //不加這個傳入為空的判斷的話會訪問越界return false;
class Solution {
public:bool findNumberIn2DArray(vector<vector<auto>>& matrix, auto target) {if(matrix.empty()) //不加這個傳入為空的判斷的話會訪問越界return false;auto rows = matrix.size();auto columns = matrix[0].size();if(rows>0 && columns>0){ auto row = 0 ;auto column = columns-1;while(row<rows&&column>=0){if(matrix[row][column]==target) {return true;}else if(matrix[row][column]>target) {column--;}else row++;}}return false;}
};
?
總結
以上是生活随笔為你收集整理的剑指offer:面试题04. 二维数组中的查找的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer: 面试题03. 数组中重
- 下一篇: QString与string的相互转换