Spiral Matrix && Spiral MatrixII

Spiral Matrix

我的思路:

1、这题是去螺旋遍历一个二维vector,将结果存入一维vector中。

2、建立一个死循环,在循环里面放置4个循环,表示螺旋遍历的四个方向,然后在每个方向的遍历之前放置判断条件,如果满足条件就返回。

3、程序中要维护四个变量,也就是小循环的判断条件,当前行列的起始和结束值。

代码如下:

    vector<int> spiralOrder(vector<vector<int> > &matrix) {
    	vector<int> ans;
    	int m = matrix.size();
    	if (m == 0)
    	        return ans;
    	int n = matrix[0].size();
    	int nbegin = 0, nend = n, mbegin = 0, mend = m;
		while (1) {
		    if (nbegin == nend)
		        return ans;
    		for (int i = nbegin; i < nend; i++)
    			ans.push_back(matrix[mbegin][i]);
    		mbegin++;
			if (mbegin == mend)
				return ans;
    		for (int i = mbegin; i < mend; i++)
    			ans.push_back(matrix[i][nend - 1]);
    		nend--;
			if (nbegin == nend)
				return ans;
    		for (int i = nend - 1; i >= nbegin; i--)
    			ans.push_back(matrix[mend - 1][i]);
    		mend--;	
			if (mbegin == mend)
				return ans;
    		for (int i = mend - 1; i >= mbegin; i--)
    			ans.push_back(matrix[i][nbegin]);
    		nbegin++;
    	}
    	return ans;
    }

别人思路1:

1、DFS(深度优先搜索),建立一个4,2的二维数组。然后定义每个方向要改变的量。再定义一个二维数组来描述是否已经走过这个点。利用这个二维数组来退出递归。

2、基本的控制还是基于四个方向每次遍历的坐标改变。


别人思路2:

1、递归思想:写一个函数用来递归,这个函数中用if和else来区分上半部分,下半部分的遍历使用本身函数的递归。

2、缺点:代码太长,而且冗余,还不如直接用循环控制来得好。


我的心得:不管什么方法,关键还是在于理清楚每次每个方向上起始和结束改变的值。不管是循环还是递归。


Spiral MatrixII

我的思路:

1、题目要求:给一个数,给出这个数字大小的螺旋数组。

2、我的思路一塌糊涂,第一眼,返回值是vector,好麻烦啊, 每次push都要按照顺序来,怎么控制这个顺序?(stupid)直接将数存在数组中,然后再把数赋值到vector中。

3、赋值控制,要常规化,形成规律,一开始第一个循环是赋值n个,第二个循环n-1,第三个循环n-1,第四个n-2,这样控制起来就很麻烦。直接将每个循环赋值个数改为n-1。

4、n是奇偶数的差别,如果是奇数最后的一个数单独赋值。

代码如下:一团糟,变量命名也是醉了

    vector<vector<int> > generateMatrix(int n) {
        vector<vector<int>> ans;
    	if (n <= 0)
    		return ans;
    	int matrix[n][n];
    	int	row = 0, column = 0, current = 1;
    	int len = n, start = 0;
    	int	tmp = n & 1 ? n / 2 : n / 2 + 1;
    
    	while (tmp--) {
    		while (column < len - 1)	matrix[row][column++] = current++;	
    		while (row < len - 1)		matrix[row++][column] = current++;	
    		while (column > start)		matrix[row][column--] = current++; 	
    		while (row > start)		matrix[row--][column] = current++;  
    		
    		len--;	start++;	column++;	row++;
    	}
    	if (n & 1)	
    		matrix[n/2][n/2] = n * n;
    	for (int i = 0; i < n; i++) {
    		vector<int> a(matrix[i], matrix[i] + n);
    		ans.push_back(a);
    	}
    
    	return ans;
    }

别人思路:

1、暂时没有发现好的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值