日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每天一道LeetCode-----在有序的二维数组中查找某个元素

發(fā)布時間:2024/4/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天一道LeetCode-----在有序的二维数组中查找某个元素 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原題鏈接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-----在有序的二维数组中查找某个元素的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。