(关注数据结构和算法,了解更多新知识)
最近一网友发文称自己公司新招了一位优质员工,所谓的优质员工并不是技术有多厉害,而是该员工的孩子刚出生,媳妇又没工作,还有房贷,所以组里的脏活累活全让他干。
在这种情况下该员工如果不是富二代,他是断然不敢离职的,以这样的方式欺负别人也是够无耻的,我们来看下各位网友的评论。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第240题:搜索二维矩阵 II。这题也是字节的一道面试题,我们来看下。
问题描述
来源:LeetCode第240题
难度:中等
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
1,每行的元素从左到右升序排列。
2,每列的元素从上到下升序排列。
示例1:
输入: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
m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-10^9 <= matrix[i][j] <= 10^9
每行的所有元素从左到右升序排列
每列的所有元素从上到下升序排列
-10^9 <= target <= 10^9
问题分析
这题是让在二维数组中找到目标值target,而二维数组中每一行和每一列都是有序的。我们可以从两个方向查找,一个是左下角一个是右上角。
假如从左下角开始查找,如果查找的值小于target,下一步就往右边找,如果查找的值大于target,下一步就往上边找。
假如从右上角开始查找,如果查找的值小于target,下一步就往下面找,如果查找的值大于target,下一步就往左边找。
能不能从左上角和右下角位置开始查找呢?这个明显是不行的,假如从左上角开始查找,当查找的值小于target的时候,需要往更大的地方查找,而左上角位置的右边和下边都是比原来值大的,究竟该往哪个方向查找呢?这个时候就不好确定了,同理右下角也一样。
我们就从右上角开始查找来看下这题的代码。
JAVA:
public boolean searchMatrix(int[][] matrix, int target) {
// 从矩阵右上角开始搜索
int col = matrix[0].length - 1;// 列
int row = 0;// 行
while (col >= 0 && row <= matrix.length - 1) {
if (target == matrix[row][col]) {
return true;// 如果找到就直接返回
} else if (target < matrix[row][col]) {
col--;// 如果查找的值大了,下一步往左找
} else if (target > matrix[row][col]) {
row++;// 如果查找的值小了,下一步往下找
}
}
return false;// 如果没找到,返回false
}
C++:
public:
bool searchMatrix(vector<vector<int>> &matrix, int target) {
// 从矩阵右上角开始搜索
int col = matrix[0].size() - 1;// 列
int row = 0;// 行
while (col >= 0 && row <= matrix.size() - 1) {
if (target == matrix[row][col]) {
return true;// 如果找到就直接返回
} else if (target < matrix[row][col]) {
col--;// 如果查找的值大了,下一步往左找
} else if (target > matrix[row][col]) {
row++;// 如果查找的值小了,下一步往下找
}
}
return false;// 如果没找到,返回false
}
C:
bool searchMatrix(int **matrix, int matrixSize, int *matrixColSize, int target) {
// 从矩阵右上角开始搜索
int col = *matrixColSize - 1;// 列
int row = 0;// 行
while (col >= 0 && row <= matrixSize - 1) {
if (target == matrix[row][col]) {
return true;// 如果找到就直接返回
} else if (target < matrix[row][col]) {
col--;// 如果查找的值大了,下一步往左找
} else if (target > matrix[row][col]) {
row++;// 如果查找的值小了,下一步往下找
}
}
return false;// 如果没找到,返回false
}
Python:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
# 从矩阵右上角开始搜索
col = len(matrix[0]) - 1 # 列
row = 0 # 行
while col >= 0 and row <= len(matrix) - 1:
if target == matrix[row][col]:
return True # 如果找到就直接返回
elif target < matrix[row][col]:
col -= 1 # 如果查找的值大了,下一步往左找
elif target > matrix[row][col]:
row += 1 # 如果查找的值小了,下一步往下找
return False # 如果没找到,返回false
笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。