目录侠
这次我们引进两道leetcode上面的题目 大家不用害怕 我会给大家讲清楚 这些题目的,
59. 螺旋矩阵 II - 力扣(LeetCode) (leetcode-cn.com)
54. 螺旋矩阵 - 力扣(LeetCode) (leetcode-cn.com)
题目中告诉我们的是 我们的要将一个数据 按照螺旋状态进行排序,这个其实是 不是很好想的,因为我们会在循环的时候,遇到很多问题,比如说 不知道具体的界限在哪里,会让我们很头疼,这个题目其实思路倒是很好想,我们遍历这个二维数组,然后在对应的位置进行赋值处理,看似好像说起来很简单,当我们真正去实现的时候,会发现,从左到右,从上到下,从右向左,从下向上的操作处理,但是似乎并不是那么的简单,因为我们难道只会循环这样的过程一次吗,每次循环我们要进行赋值的次数又是几次,这样一想,似乎并没有那么简单,
现在我给大家引入一个比较好的思路,就是我们每次赋值完一次 我们就告诉自己这一行与我们无关了,然后进行条件判断,
这里条件判断是说判断上下左右界的问题,什么意思那,其实就是我们 只要是删除完一行,我们就要-判断一次,
比如说 我们将第一行删除完,是不是要将进行赋值的数据移动到第二行,这个时候你想想 我们的上边界 是不可以大于下边界,一旦大于说明我们这个中间没有数据要进行赋值处理,这个就是我们评判的标准,下面代码
演示 里面有注释
大家看一下
class Solution {
public:
vector> generateMatrix(int n) {
vector> res(n, vector(n, 0));
int count=1;
int left=0;//左边界
int right=n-1;//这里确定右边界
int up=0;//上边界
int down=n-1;//这里确定下边界
while(true){
for(int i=left;i<=right;++i){//
res[up][i]=count++;
}
if(++up>down){//如果上边界大于下边界 退出
break;
}
for(int i=up;i<=down;i++){
res[i][right]=count++;
}
if(--right=left;i--){
res[down][i]=count++;//这个循环体里面的是书写 一共是不变的 比如说 这里down是不变的 我们对右边进行循环
}
if(--down=up;i--){
res[i][left]=count++;
}
if(++left>right){
break;
}
}
return res;
}
};
这样一来 我们将判断我们数组直接还有没有数据作为我们循环的条件,使得思路更加明确 没删除一行 我们就去看看是不是不满足条件,
直到不满足我们结束 这样就结束
首先设定上下左右边界
首先是向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,在代码中就是重新定义上边界
判断若重新定义后,如果上下边界不是正常的大小关系,表明螺旋矩阵遍历结束,跳出循环,返回答案
若上下边界不交错(就是满足右边大于左边,下面大于上边),则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理
不断循环以上步骤,直到某两条边界交错,跳出循环,返回我们的结果
打卡完成 继续加油xdm