「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。
说在前面
使用JavaScript来进行算法训练可以有效地提升我们对JavaScript更多语法api的熟悉程度,也能提高我们的逻辑思维能力。
很多人总是对前端开发存在一定的误解,甚至认为前端开发只是一个“切图仔”,但在我看来却并不是如此,现在是大前端时代,前端的很多技术迅速发展,给我们前端开发工程师带来很多新的技术路线,同时也给我们带来了许多新的挑战。为了更好地提升自身的技术水平和基础素养,我觉得前端工程师也非常有必要着力于提升自己的算法能力和逻辑思维,因此我自己在平时空余时间也会去寻找一些比较有意思的算法进行学习,目前仍在继续提升的阶段。
今日算法
题目链接
题目的链接为:leetcode-cn.com/problems/lu…
题目描述
给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。
幸运数是指矩阵中满足同时下列两个条件的元素:
在同一行的所有元素中最小 在同一列的所有元素中最大
示例
示例1
输入:matrix = [[3,7,8],[9,11,13],[15,16,17]]
输出:[15]
解释:15 是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值。
示例2
输入:matrix = [[1,10,4,2],[9,3,8,7],[15,16,17,12]]
输出:[12]
解释:12 是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值。
提示
m == mat.lengthn == mat[i].length1 <= n, m <= 501 <= matrix[i][j] <= 10^5矩阵中的所有元素都是不同的
解题思路
读完题目后我们可以知道,题意就是要我们从给定二维数组中找到所有满足条件的元素,这个元素要满足的条件为:在同一行的所有元素中最小,在同一列的所有元素中最大,对此我们可以遍历这个二维数组,先求出该二维数组每一行的最小值,再求出该二维数组每一列的最大值。
- 1、声明长度为 matrix数组行数 的数组 column 并初始化为 Infinity ,用于保存每一行的最小值
- 2、声明长度为 matrix数组列数 的数组 row 并初始化为 0 ,用于保存每一列的最大值
- 3、遍历matrix数组,更新数组column、数组row的值
- 4、找出数组column和数组row中相等的值即为结果 将以上步骤转换为代码如下:
完整代码
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var luckyNumbers = function(matrix) {
let column = new Array(matrix.length).fill(Infinity),
row = new Array(matrix[0].length).fill(0);
for(let i = 0; i < matrix.length; i++){
for(let j = 0;j < matrix[i].length; j++){
column[i] = Math.min(matrix[i][j],column[i]);
row[j] = Math.max(matrix[i][j],row[j]);
}
}
let res = [];
for(let i = 0; i < row.length; i++){
for(let j = 0; j < column.length; j++){
if(row[i] == column[j]) res.push(row[i]);
}
}
return res;
};