每天一道LeetCode-----在有序的二维数组中查找某个元素
原題鏈接Search a 2D Matrix
判斷一個二維數(shù)組中是否存在某個值
該數(shù)組滿足
- 每一行元素按從左到右遞增順序排列
- 當前行的第一個元素大于上一行的最后一個元素
假設二維數(shù)組的維度是m × n
考慮二維數(shù)組中第0行最后一列的元素matrix[i][j],即i = 0, j = n - 1
如果matrix[i][j] == target,那么直接返回就可以。
現(xiàn)在考慮不相等的情況,根據(jù)數(shù)組的排列情況可知
由matrix[i][j]的位置可知,在第i行,沒有比matrix[i][j]大的值;在第j列,沒有比matrix[i][j]小的值,即
matrix[i][j - 1] < matrix[i][j]并且matrix[i + 1][j] > matrix[i][j]
也就是說第一個比matrix[i][j]大的元素是matrix[i + 1][j],而第一個比matrix[i][j]小的元素是matrix[i][j - 1]
假設matrix[i][j] > target,那么應該找第一個比matrix[i][j]大的元素,所以跳到下一行尋找,即另i = i + 1。一旦另i = i + 1,就好比承認從第i行的第j列,第i行的第j-1列,…,第i行的第0列元素都比target小,那么就沒必要在第i行上浪費時間,直接跳到下一行,把[i + 1, j]看做是二維數(shù)組第0行最后一列的位置。也就是說,現(xiàn)在二維數(shù)組的維度是(m - i - 1) × n,第0行最后一列的元素是matrix[i + 1][j]
假設matrix[i][j] < target,那么應該找第一個比matrix[i][j]小的元素,由上面的結論可知在j-1列,所以另j = j - 1。一旦另j = j - 1,就好比承認第i行的第j列,第i+1行的第j列,…,第m行的第j列元素都比target大,那么就可以把第j列拋棄掉,把[i, j - 1]看做是二維數(shù)組第0行最后一列的位置。也就是說,現(xiàn)在二維數(shù)組的維度是m × j,第0行最后一列的元素是matrix[i][j - 1]
這樣,以新的起始點開始執(zhí)行查找操作,程序唯一需要做的事情就是判斷matrix[i][j]和target的大小,matrix[i][j]大,則j = j - 1;matrix[i][j]小,則i = i + 1
代碼如下
class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if(matrix.empty() || matrix[0].empty())return false;int m = matrix.size();int n = matrix[0].size();int i = 0, j = n - 1;while(i < m && j >= 0){if(matrix[i][j] == target)return true;/* 向左移動 */else if(matrix[i][j] > target)--j;/* 向下移動 */else++i;}return false;} };原題鏈接Search a 2D Matrix II
二維數(shù)組中元素的排列規(guī)則為
- 每一行的元素從左到右按遞增順序排列
- 每一列的元素從上到下按遞增順序排列
解決方法和上面一模一樣
代碼如下
class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if(matrix.empty() || matrix[0].empty())return false;int m = matrix.size();int n = matrix[0].size();int i = 0, j = n - 1;while(i < m && j >= 0){if(matrix[i][j] == target)return true;/* 向左移動 */else if(matrix[i][j] > target)--j;/* 向下移動 */else++i;}return false;} };總結
以上是生活随笔為你收集整理的每天一道LeetCode-----在有序的二维数组中查找某个元素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----生命游
- 下一篇: 每天一道LeetCode-----链表排