【leetcode】-54-螺旋矩阵

 

刚开始的时候低估了这个题目,只把3X3的情况做出来了(错误代码放在文末)

思路:由于不需要存储访问过的路径,因此可以考虑通过更新边界的方式控制访问路径。

首先访问上边界所在的行,上边界访问结束之后,更新上边界

随后访问由边界所在的列,右边界访问结束之后,更新右边

其他边界同理,在更新边界的过程中一旦出现上下边界相交,或者左右边界相交的情况,则跳出循环

 vector<int> spiralOrder(vector<vector<int>>& matrix)
    {
	    int m = matrix.size();
	int n = matrix[0].size();
	vector<int> res;
	if (m == 0 || n == 0) return res;
	vector<vector<int>> flag(m, vector<int>(n, 0));

	int s = 0, z = 0, x = m - 1, y = n - 1;//分别为上左下右边界

	while (true) {
		for (int i = z; i <= y; i++)res.push_back(matrix[s][i]);//从左到右
		if (++s > x) break;//更新上边界,上边界与下边界重合时,跳出循环		
		for (int i = s; i <= x; i++)res.push_back(matrix[i][y]);//从上到下
		if (--y < z) break;//更新右边界
		for (int i = y; i >= z; i--)res.push_back(matrix[x][i]);//从右到左
		if (--x < s) break;//更新下边界
		for (int i = x; i >= s; i--)res.push_back(matrix[i][z]);//从右到左
		if (++z > y) break;//更新左边界
	}
	return res;
    }
vector<int> spiralOrder(vector<vector<int>>& matrix)
    {
        //开始时优先向右走,直到右侧无路可走
	//然后优先向下,直到下册无路可走
	//左,上同理
	//建立二维数组标记是否访问过
	vector<int> res;
	int m = matrix.size();
	int n = matrix[0].size();
	if (m == 0 || n == 0) return res;
	vector<vector<int>> flag(m, vector<int>(n, 0));
   	if (n == 1) {
		for (int k = 0; k < m; k++)
			res.push_back(matrix[k][0]);
		return res;
	}
	if (m == 1) {
		for (int k = 0; k < n; k++)
			res.push_back(matrix[0][k]);
		return res;
	}

	int i = 0, j = 0;
	while (flag[i][j] == 0)
	{
		while (flag[i][j] == 0 && j < n - 1) {
            res.push_back(matrix[i][j]);
			flag[i][j] = 1;//标记为访问过
			j++;
		}
		if (flag[i][j] == 1) break;

		while (flag[i][j] == 0 && i < m - 1) {
            res.push_back(matrix[i][j]);
			flag[i][j] =1;//标记为访问
			i++;			
		}
		if (flag[i][j] == 1) break;

		while (flag[i][j] == 0 && j > 0) {
            res.push_back(matrix[i][j]);
			flag[i][j] =1;//标记为访问过
			j--;
			
		}
		if (flag[i][j] == 1) break;

		while (flag[i][j] ==0 && i > 1) {
            res.push_back(matrix[i][j]);
			flag[i][j] =1;//标记为访问过			
			i--;			
		}
		if (flag[i][j] == 1) break;
        res.push_back(matrix[i][j]);
		j++;
	}
	return res;
    }

猜你喜欢

转载自blog.csdn.net/qq_39328436/article/details/114272502