54. 螺旋矩阵
难度中等653收藏分享切换为英文关闭提醒反馈
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
解法
- 就按照题意逆时针遍历
- 注意最后一次遍历的情况处理
rust
impl Solution {
pub fn spiral_order(matrix: Vec<Vec<i32>>) -> Vec<i32> {
let mut res = Vec::new();
if matrix.len()==0{
return res;
}
let rows = matrix.len();
let cols = matrix[0].len();
let iter_num = std::cmp::min(rows, cols)/2; //迭代次数 如果是奇数的话 最后一次就是一个行或列 单独考虑
for iter in 0..iter_num{
//上面遍历
for col_id in iter..(cols-iter-1){
res.push(matrix[iter][col_id]);
}
//右边遍历
for row_id in iter..(rows-iter-1){
res.push(matrix[row_id][cols-iter-1]);
}
//下方遍历
for col_id in (iter+1..cols-iter).rev(){
res.push(matrix[rows-iter-1][col_id]);
}
//左边遍历
for row_id in (iter+1..rows-iter).rev(){
res.push(matrix[row_id][iter]);
}
}
//考虑剩下单行的情况
if rows <=cols && (rows&1>0){
for col_id in iter_num..cols-iter_num{
res.push(matrix[iter_num][col_id]);
}
}
//考虑剩下单列的情况
if cols < rows && (cols&1>0){
for row_id in iter_num..rows-iter_num{
res.push(matrix[row_id][iter_num]);
}
}
res
}
}
go
func spiralOrder(matrix [][]int) []int {
row := len(matrix)
if row == 0 {
return nil
}
if row == 1 {
return matrix[0]
}
col := len(matrix[0])
nums := make([]int, row*col)
if col == 1 {
for i := 0; i < row; i++ {
nums[i] = matrix[i][0]
}
return nums
}
nRoundEven := false
nRound := row
if nRound > col {
nRound = col
}
if nRound%2 == 0 {
nRoundEven = true
}
nRound = (nRound + 1) / 2
id := 0
// rowEven := false
// if row%2 == 0 {
// rowEven = true
// }
// colEven := false
// if col%2 == 0 {
// colEven = true
// }
for i := 0; i < nRound; i++ {
// fmt.Println(i, nRound, row, col)
if (nRoundEven) || (i < nRound-1) {
for j := i; j < col-i-1; j++ {
nums[id] = matrix[i][j]
id++
}
// fmt.Println(nums)
for j := i; j < row-i-1; j++ {
nums[id] = matrix[j][col-i-1]
// fmt.Println(nums)
id++
}
// fmt.Println(nums)
for j := col - i - 1; j > i; j-- {
nums[id] = matrix[row-i-1][j]
id++
}
// fmt.Println(nums)
for j := row - i - 1; j > i; j-- {
nums[id] = matrix[j][i]
id++
}
// fmt.Println(nums)
continue
}
if (nRoundEven == false) && (row <= col) {
for j := i; j < col-i; j++ {
nums[id] = matrix[i][j]
id++
}
continue
}
// fmt.Println(nums, i, row)
if (nRoundEven == false) && (row > col) {
for j := i; j < row-i; j++ {
nums[id] = matrix[j][col-i-1]
id++
}
}
// fmt.Println(nums)
}
return nums
}