练习信:
给定一个mxn元素的矩阵(m行,n列),以螺旋顺序返回矩阵的所有元素。
例如,给定以下矩阵:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
给定代码:
public class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
}
}
我的代码:
public List<Integer> spiralOrder(int[][] matrix) {
if(matrix == null || (matrix.length == 0))
return new ArrayList<Integer>();
int arriba = 0;
int derecha = matrix[0].length - 1;
int abajo = matrix.length - 1;
int izquierda = 0;
List<Integer> retorno = new ArrayList<Integer>();
while(true)
{
for(int i = izquierda; i <= derecha; i++)
retorno.add(matrix[arriba][i]);
arriba++;
for(int i = arriba; i <= abajo; i++)
retorno.add(matrix[i][derecha]);
derecha--;
for(int i = derecha; i >= izquierda; i--)
retorno.add(matrix[abajo][i]);
abajo--;
for(int i = abajo; i >= arriba; i--)
retorno.add(matrix[i][izquierda]);
izquierda++;
if(izquierda >= derecha)
return retorno;
}
}
}
错误:
Runtime Error Message:
Line 13: java.lang.ArrayIndexOutOfBoundsException: 1
Last executed input:
[[1,2,3,4,5,6,7,8,9,10]]
有什么建议?我真的无法分辨出什么问题。为什么超出范围?锻炼可以在这里找到
我用此矩阵尝试了您的方法:
int[][] matrix = {{1,2,3},
{2,3,4},
{3,4,5}};
我什么也没得到ArrayIndexOutOfBoundsException
。您的代码似乎没有引发任何错误。
但是,我注意到输出不符合预期。它给我的输出是12345432
(只有8个数字),缺少3
矩阵中间的数字。
仔细查看您的代码后,我发现错误出在if(izquierda >= derecha)
。如果将其更改为if(izquierda > derecha)
,则不会错过3
。出于同样的原因,您还需要检查arriba > abajo
,否则您的程序不适用于列多于行的任何矩阵。
编辑: 每个for循环后都需要这些检查。
我建议您将return retorno;
while循环移到外部,然后插入break
检查中:
public List<Integer> spiralOrder(int[][] matrix) {
if(matrix == null || (matrix.length == 0))
return new ArrayList<Integer>();
int arriba = 0;
int derecha = matrix[0].length - 1;
int abajo = matrix.length - 1;
int izquierda = 0;
List<Integer> retorno = new ArrayList<Integer>();
while(true)
{
for(int i = izquierda; i <= derecha; i++)
retorno.add(matrix[arriba][i]);
arriba++;
if(arriba > abajo)
break;
for(int i = arriba; i <= abajo; i++)
retorno.add(matrix[i][derecha]);
derecha--;
if(izquierda > derecha)
break;
for(int i = derecha; i >= izquierda; i--)
retorno.add(matrix[abajo][i]);
abajo--;
if(arriba > abajo)
break;
for(int i = abajo; i >= arriba; i--)
retorno.add(matrix[i][izquierda]);
izquierda++;
if(izquierda > derecha)
break;
}
return retorno;
}
代码说明(应要求提供):
假设您有一个矩阵,四个矩阵围在矩阵周围,每个人都在一侧。这四名个人被称为arriba
,derecha
,abajo
,和izquierda
:
arriba
1 2 3 4 5
izquierda 2 3 4 5 6 derecha
3 4 5 6 7
abajo
这四个人可以看到前面的数字行:
arriba
看到1 2 3 4 5
。derecha
看到5 6 7
。abajo
看到3 4 5 6 7
。izquierda
看到1 2 3
。只要将这些人前面的所有数字都添加到列表中retorno
,他们就会向前跳一步。例如,在第一个for循环之后,它看起来像这样:
1 2 3 4 5
arriba
izquierda 2 3 4 5 6 derecha
3 4 5 6 7
abajo
在while循环的整个第一次迭代之后,它们的样子如下:
1 2 3 4 5
arriba
2 izquierda 3 4 5 derecha 6
abajo
3 4 5 6 7
arriba
正在向下移动。derecha
向左移动。abajo
正在向上移动。izquierda
向右移动。一旦这两个人中的 任何 一个经过彼此,您就会知道他们之间没有数字,因此您需要 立即 停止循环。这就是为什么您需要检查两个人是否每次 经过某个步骤
时 都经过对方(每个for循环之后)。
我目前正在做一个音频信号处理项目,需要在Java中的一个复杂矩阵上使用SVD。我当前的线性代数库是Apache Commons。但它只提供实矩阵的SVD,JAMA、JBLAS、EJML、ojAlgo都不支持复杂的SVD。 我一直在用一些技巧从一个等效的实矩阵中找到SVD。然而,当我重建矩阵时,这种技术对于虚部有很大的不准确性。
本文向大家介绍python如何进行矩阵运算,包括了python如何进行矩阵运算的使用技巧和注意事项,需要的朋友参考一下 python进行矩阵运算的方法: 1、矩阵相乘 2、矩阵对应元素相乘 multiply()函数:数组和矩阵对应位置相乘,输出与相乘数组/矩阵的大小一致 3、矩阵点乘 4、矩阵求逆 5、矩阵转置 6、计算每一列、行的和 内容扩展: numpy矩阵运算 (1) 矩阵点乘:m=mult
本文向大家介绍Python中矩阵创建和矩阵运算方法,包括了Python中矩阵创建和矩阵运算方法的使用技巧和注意事项,需要的朋友参考一下 矩阵创建 1、from numpyimport *; a1=array([1,2,3]) a2=mat(a1) 矩阵与方块列表的区别如下: 2、data2=mat(ones((2,4))) 创建一个2*4的1矩阵,默认是浮点型的数据,如果需要时int类型,可以使用
使用JCUDA对复数进行运算的最佳方法是什么?我应该使用cuComplex格式还是有其他的解决方案(像一个数组,实部和虚部一个接着一个走)?我非常感谢使用这种类型的计算的java代码示例。 由于我的目的是用GPU求解复杂的线性方程组,所以我不想只附上jCuda。用GPU进行这样的计算有哪些可供选择的方式?
着色器语言中通过关键字mat2、mat3、mat4分别声明一个2x2矩阵、3x3矩阵、4x4矩阵,通过内置函数mat2()、mat3()、mat4()分别创建一个2x2矩阵、3x3矩阵、4x4矩阵。 关键字 数据类型 mat2 2x2矩阵,4个元素 mat3 3x3矩阵,9个元素 mat4 4x4矩阵,16个元素 声明变量 关键子mat4声明一个4x4矩阵 mat4 matrix4; 构造函数赋
问题内容: 我正在尝试计算Java中的逆矩阵。 我遵循伴随方法(首先计算伴随矩阵,然后转置该矩阵,最后将其乘以行列式值的倒数)。 当矩阵不太大时有效。我检查过,对于尺寸最大为12x12的矩阵,可以快速提供结果。但是,当矩阵大于12x12时,完成计算所需的时间呈指数增长。 我需要反转的矩阵是19x19,并且花费太多时间。消耗更多时间的方法是用于行列式计算的方法。 我使用的代码是: 有人知道如何更有效