一. 簡介
上一篇文章關于"在二維數組中查找某個元素"的問題,提供了兩種解題思路,文章如下:
力扣網C語言編程題:搜索二維矩陣的普通解法與二分查找法-CSDN博客
本文提供第三種解題思路:從左下角->右上角,或者右上角->左下角。
二.力扣網C語言編程題:搜索二維矩陣(右上角->左下角解法)
?解題思路三:(換行或換列)
因為題目中,數組中元素是每行元素是遞增的,同時,每一行的首元素比上一行最后一個元素大,那么,這個二維數組中的每一列的元素也是遞增的。(可以畫一個二維元素的框圖來理一下邏輯)
可以從右上角開始查找元素:
如果 nums[i][j] == target,則直接返回 true。
如果 nums[i][j] > target,根據列元素遞增,則說明該列所有元素都是大于 target,丟棄該列,j--。
如果 nums[i][j] < target,根據行元素也是遞增的,則說明該行所有元素都是小于 target,丟棄改行,i++。
C語言實現如下:
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {int m = matrixSize;int n = matrixColSize[0];int i = 0;int j = n-1;while((i < m) && (j >= 0)) {if(matrix[i][j] == target) {return true;}else if(matrix[i][j] < target) {//說明該行所有元素都小于 target,換下一行i++;}else {//matrix[i][j] > target,說明該列所有元素都大于target,換上一列j--;}} return false;
}
可以看出,這種方法的時間復雜為 O(m+n)。
也可以從左下角開始向右上角搜索,C語言實現如下:
//從左下角到右上角進行查找
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {int row = matrixSize;int col = matrixColSize[0];int i = row-1;int j = 0;while((i >= 0) && (j < col)) {if(matrix[i][j] == target) {return true;}else if(matrix[i][j] > target) {//說明該行所有元素都大于target,則跳到上一行i--;}else {//matrix[i][j]<target,說明該列所有元素都小于target//跳到下一列j++;}} return false;
}
上面的實現思路其實和從右上角->左下角的方法是類似的。