JavaScript程序:检查矩阵的所有行是否为彼此的循环旋转
矩阵是一种二维数组,它包含一个固定长度的数组定义行,而对于该数组的每个索引,都存在固定长度的数组,这些数组的长度定义了矩阵中存在的列数。我们可以将任何类型的数据存储在矩阵提供的单元格中。
我们将得到一个矩阵,每一行包含一些整数,我们必须检查每一行是否都是彼此的旋转。彼此的旋转意味着通过一些左旋转或右旋转,我们可以产生每一行的相同组合。
示例1
让我们假设给定的矩阵是
mat = [ [1, 2, 3], [2, 3, 1], [3, 1, 2]] Output: Yes
解释:假设第一行是常量,旋转其余的行,我们可以得到如下结果:
通过将第二行向右旋转一次,将第三行向右旋转两次,我们可以使这两行与第一行相同。
示例2
mat = [ [1, 2, 3], [ 2, 1, 3], [ 1, 2, 3]] Output: No
解释:在上面的矩阵中,第一行和第三行相同,但我们无法通过任何次数的旋转将第二行转换为与第一行相同。
方法
我们已经看到了一个很好的例子来理解这个问题,现在让我们看看实现代码的步骤:
首先,我们将定义一个rotate函数,使用双指针和交换技术来旋转作为参数传递给它的数组的元素。
之后,我们将定义check函数,并将给定的矩阵传递给它进行检查。
在函数中,我们首先通过获取行和列来获取矩阵的长度,然后使用for循环检查从1到最后一行与第0行。
如果当前行与第一行相同,则我们将跳到下一行。
否则,我们将调用rotate函数并将其旋转到下一个旋转。
我们将重复此过程,直到找到与第0行相同的数组或列数次数。
如果即使在最大旋转后,当前行也不等于第0行,则我们将返回false。
如果所有行最终都变得相等,则我们将返回true。
示例
在下面的示例中,我们检查矩阵的所有行是否为彼此的循环旋转。输入和预期输出如下所示。
输入:matrix = [ [ 1, 2, 3 ], [ 2, 3, 1 ], [ 3, 1, 2 ] ]
输出:Yes
// function to rotate the given array
function rotate(arr){
var l = 0;
var r = arr.length-1;
while(l < r){
arr[l] += arr[r];
arr[r] = arr[l]-arr[r];
arr[l] = arr[l]-arr[r];
l++;
}
return arr;
}
// function to check if the given matrix can have the same rows
// after the certain number of rotations
function check(mat){
// getting number of rows
var rows = mat.length
// getting number of columns
var cols = mat[0].length
// traversing over the each row of given matrix
for(var i = 1; i < rows; i++){
var k = 0;
while(k < cols) {
var j = 0;
for(j = 0; j<cols; j++){
if(mat[0][j] != mat[i][j]){
break;
}
}
if(j == cols){
break;
}
else{
mat[i] = rotate(mat[i]);
}
k++;
}
if(k == cols){
return false;
}
}
return true;
}
// defining the matrix
var mat = [ [1, 2, 3],
[2, 3, 1],
[3, 1, 2]];
console.log("The given matrix is: ");
console.log(mat);
if(check(mat) == true){
console.log("Yes, all the rows of the matrix are circular rotation of each other");
}
else{
console.log("NO, all the rows of the matrix are not in the circular rotation of each other");
}
输出
The given matrix is: [ [ 1, 2, 3 ], [ 2, 3, 1 ], [ 3, 1, 2 ] ] Yes, all the rows of the matrix are circular rotation of each other
时间和空间复杂度
上述代码的时间复杂度为O(N*M*M),其中N是行数,M是给定矩阵中存在的列数。我们以行方式遍历矩阵,得到N的因子,而行的比较和旋转得到M*M的因子。
上述代码的空间复杂度为O(1),因为我们没有使用任何额外的空间。
结论
在本教程中,我们实现了JavaScript程序来检查给定矩阵的所有行是否为彼此的循环旋转,方法是旋转每一行并与第0行进行比较。我们使用双指针和交换方法来旋转给定矩阵的行。上述代码的时间复杂度为O(N*M*M),空间复杂度为O(1)。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP