54. 螺旋矩阵-M

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/scylhy/article/details/87798852

54. 螺旋矩阵-M

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

  • 分析
    经过几个版本代码的给更新,体会到,螺旋矩阵的难点在于控制输出不要重复;这里的一个解决办法:
  1. 先右上-|,再左下-|(并且边的两个角,在一个循环里的访问时左闭右开)
  2. 左下在单行或单列下的重复访问右上已经访问过的元素:
    需要注意的是在单行或单列的情况下,左下遍历,会重复访问右上已经访问过的元素,所有要加上单行/列的判断条件,若是单行/列则只进行右上需要注意的是在单行或单列的情况下,左下遍历,会重复访问右上已经访问过的元素,所有要加上单行/列的判断条件,若是单行/列则只进行右上
  3. 奇数个元素,最后一个元素被忽略,这跟遍历的方法有关:
    因为边角,在一个循环上,是左闭右开,故当矩阵有奇数个元素时,最后一个元素会被忽略掉,这个要另加处理

如图所示:
matrix

  • code
package main

import "fmt"
func spiralOrder(matrix [][]int) []int {
	a,b,c,d:=0,0,len(matrix)-1,0
	if c>=0{ d=len(matrix[0])-1 } //{},无法获取d的长度
	//[][]int{{}} ,情况,被c--,d--给消除了
	var e []int
	for a<=c&&b<=d{
		for i:=b;i<d;i++{
			e=append(e,matrix[a][i])
		}
		for i:=a;i<c;i++{
			e=append(e,matrix[i][d])
		}
		for i:=d;i>b&&a<c;i--{
			e=append(e,matrix[c][i])
		}
		for i:=c;i>a&&b<d;i--{
			e=append(e,matrix[i][b])
		}
		if a==c||b==d{ //由于,循迹方式是不含最后一个,故当定位点在x或y轴上重叠时,会丢失元素
		//其实就是,矩阵元素个数为奇数个,丢失了最后一个
			e=append(e,matrix[c][d])
		}
		a++;b++;c--;d-- //[][]int{{}} ,情况,被c--,d--给消除了
	}
	return e
}
func main(){
	fmt.Println(spiralOrder([][]int{}))
	fmt.Println(spiralOrder([][]int{{}}))
	fmt.Println(spiralOrder([][]int{{1}}))
	fmt.Println(spiralOrder([][]int{{1},{2}}))
	fmt.Println(spiralOrder([][]int{{1,2,3,4}}))
	fmt.Println(spiralOrder([][]int{{1, 2, 3, 4},
	{5,6,7,8}}))
	fmt.Println(spiralOrder([][]int{{1, 2},
	{3, 4},
	{5,6}}))
	fmt.Println(spiralOrder([][]int{{1, 2, 3, 4},
	{5, 6, 7, 8},
	{9,10,11,12}}))
	fmt.Println(spiralOrder([][]int{{1, 2, 3 },
	{4,5,6},
	{7,8,9}}))
}

/*
矩阵循迹方式;
+++-
#@$-
#&^-
#***
但注意若2n+1*2n+1的矩阵,最中间的元素会被忽略;
所以要特殊处理一下最中间的元素
++—
&$—
&**
*/
  • code2
class Solution {
public:
    vector<int> output;
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m=matrix.size();
         if(m==0)
            return output;
        int n=matrix[0].size();//m
        if(n==0)
            return output;
        int a=0;
        int bm=m-1;
        int bn=n-1;
        int b=bm>bn?bn:bm;
        while(a<b&&bm&&bn)
        {
            output.push_back(matrix[a][a]);
            for(int i=a+1;i<=bn;i++)
                output.push_back(matrix[a][i]);
            for(int i=a+1;i<bm;i++)
                output.push_back(matrix[i][bn]); 
            output.push_back(matrix[bm][bn]);
            for(int i=bn-1;i>=a;i--)
                output.push_back(matrix[bm][i]);
            for(int i=bm-1;i>a;i--)
                output.push_back(matrix[i][a]);
            bm--;bn--;b--;a++;
        }
        if(a==b)
        {
                if(a==bm)
                {
                    for(int i=a;i<=bn;i++)
                        output.push_back(matrix[a][i]);
                }else if(a==bn)
                {
                    for(int i=a;i<=bm;i++)
                        output.push_back(matrix[i][a]);
                }
        }
        return output;
    }
};

猜你喜欢

转载自blog.csdn.net/scylhy/article/details/87798852
今日推荐