Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例 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
示例 2:
输入: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 = 20
输出:false
提示:
m == matrix.lengthn == matrix[i].length1 <= n, m <= 300- <=
matrix[i][j]<= - 每行的所有元素从左到右升序排列
- 每列的所有元素从上到下升序排列
- <=
target<=
思路分析
- 看到题目的第一时间想到的最粗暴的解法就是使用数组的
some方法,matrix.some(item => item.includes(target)),果不其然,这种方法会超时。 - 题目中给出的数组 每行从左到右升序,每列从上到下升序,那么我们可以知道数组肯定是左上角的最小,右下角的最大。
- 使用
row < matrix.length && col >= 0作为条件循环,若target大于当前元素,则需要row向下移动,即row++;若target小于当前元素,则需要col向左移动,即col--。若相等则返回true。循环完成后没有找到相等的,则返回false。
AC 代码
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function(matrix, target) {
if (matrix.length === 0 || matrix[0].length === 0) {
return false;
}
let row = 0;
let col = matrix[0].length - 1;
while (row < matrix.length && col >= 0) {
if (target > matrix[row][col]) {
row++;
} else if (target < matrix[row][col]) {
col--;
} else {
return true;
}
}
return false;
};
结果:
- 执行结果: 通过
- 执行用时:344 ms, 在所有 JavaScript 提交中击败了68.44%的用户
- 内存消耗:43.5 MB, 在所有 JavaScript 提交中击败了63.19%的用户
- 通过测试用例:129 / 129