classSolution { publicint[] findDiagonalOrder(int[][] mat) { intm= mat.length, n = mat[0].length, cnt = m*n; int[] ans = newint[cnt]; intx=0, y = 0, direct = 1, flag = 0; while(flag < cnt){ ans[flag] = mat[x][y]; flag++; intnx=0, ny = 0; //direct = 1沿着右上角的方向进行遍历 if(direct == 1){ //行数减一 nx = x - 1; //列数加一 ny = y + 1; } if(direct == -1){ //行数加一 nx = x + 1; //列数减一 ny = y - 1; } //处理越界的情况 if(nx < 0 || nx >= m || ny < 0 || ny >= n){ //右上方的越界情况处理 if(direct == 1){ nx = y + 1 < n ? x : x + 1; ny = y + 1 < n ? y + 1 : y; } //左下方的越界情况处理 else{ nx = x + 1 < m ? x + 1 : x; ny = x + 1 < m ? y : y + 1; } //越界变方向 direct *= -1; } x = nx; y = ny; } return ans; } }
注意:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
//处理越界的问题 if (dx < 0 || dx >= m || dy < 0 || dy >= n){ //处理右上方**已经**越界的问题 if (dir == 1) { dx = y + 1 >= n ? x + 1 : x; dy = y + 1 >= n ? y : y + 1; } //左下方已经越界的问题处理 else { dx = x + 1 >= m ? x : x + 1; dy = x + 1 >= m ? y + 1 : y; } x = dx; y = dy; } //这种情况会导致dy 取到边界值n 反着来就是不行