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)。

更新于:2023年4月13日

浏览量:138

开启你的职业生涯

完成课程后获得认证

开始学习
广告
© . All rights reserved.