Day.2 LeetCode刷题练习(螺旋矩阵)

news/2024/11/24 13:50:09/

题目:

例子:

分析题目:

本题给了一个值n要生成一个n*n的矩形,并且是螺旋的生成值。

这样我们可以把它分层来看如n =4时生成一个4*4的矩形由两层矩形构成,这样就能先遍历生成最外面的一层后再去生成里面的一层

那如何实现遍历呢?

先一行行来看(一层的上下左右行),因为起始位置是 0 0 所以我们能用对一层中的每一行用左闭右开的形式生成,这样就能顺利的完成对一层的遍历(具体就是从开始位置开始生成,每行的最后一个位置就不动,作为下一行的开始

 

思想有了那就来实现:
附:

其中的returnSize、returnColumnSizes分别表示的是

returnSize:返回共有几行

returnColumnSizes:创建一个数组,数组中对应存放了每一行有几列

写法思路:

  1. 先要生成一个二维数组,来放螺旋矩形
  2. 通过遍历来生成(用一个变量来记录每一层的开始startx、starty , 如n == 4时 startx、y一开始为0 0 然后到里面那一层时开始为 1 1 )
  3. 然后是循环次数,那个实例来看 n == 4 时 循环两边即可,那就是n/2次
  4. 但注意的是,如n == 3 、 5 、 ...  这样的奇数时其中在循环遍历后会在最中间剩下一个位置而这个位置也是最后一个遍历的值,所以可以单独领出来判断一些即可

还有一些详细的过程已经进行了注释

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){int startx = 0,starty = 0,tag = 1,count = 1;//剪掉count让其形成左闭右开*returnSize = n;//返回有几行*returnColumnSizes = (int*)malloc(sizeof(int)*n);//返回每一行的列数//创建一个二维数组int **arr =(int**)malloc(sizeof(int*)*n);//先开辟一个存放一级指针的数组for(int i = 0; i < n ;i++){arr[i] = (int*)malloc(sizeof(int)*n);//给每一行开辟空间 ,这样就形成了二级指针(*returnColumnSizes)[i] = n;//每一行赋值有几列}int i = 0 , j = 0;int tmp = n/2;while(tmp--)//遍历n/2圈如:n == 4 时遍历2圈{//对每一行进行左闭右开的遍历
//tag是用来形成右开的即n - tag 是最后一个位置处的下标for(;j <n - tag;j++)arr[i][j] = count++;for(; i <n - tag ; i++)arr[i][j] = count++;for(;j > startx; j--)arr[i][j] = count++;for(;i > starty; i--)arr[i][j] = count++;//遍历完一层后需要改变一下开始startx、y 前置++一下赋值给i、j i= ++starty;j= ++startx;tag++;//tag++一下因为此时的边界又往里面进了一位}if(n % 2 == 1)//当n是奇数时arr[n/2][n/2] = count;//对最中间没有遍历到的最后一个值就行赋值return arr;
}

总结:

  1. 找规律,找到一个不变量,才能进行遍历

http://www.ppmy.cn/news/675956.html

相关文章

861. 翻转矩阵后的得分 贪心

有一个二维矩阵 A 其中每个元素的值为 0 或 1 。 移动是指选择任一行或列&#xff0c;并转换该行或列中的每一个值&#xff1a;将所有 0 都更改为 1&#xff0c;将所有 1 都更改为 0。 在做出任意次数的移动后&#xff0c;将该矩阵的每一行都按照二进制数来解释&#xff0c;矩…

LeetCode 861. 翻转矩阵后的得分

原题目&#xff1a;https://leetcode-cn.com/problems/score-after-flipping-matrix/ 思路&#xff1a; 先试用行变换&#xff0c;把每一行的第一个都变成1&#xff0c;然后从第二列开始检查&#xff0c;保证每一列1的个数比0多。 代码&#xff1a; class Solution { public:…

LeetCode 861翻转矩阵后得分详细解法

1. 题目内容 有一个二维矩阵 A 其中每个元素的值为 0 或 1 。 移动是指选择任一行或列&#xff0c;并转换该行或列中的每一个值&#xff1a;将所有 0 都更改为 1&#xff0c;将所有 1 都更改为 0。 在做出任意次数的移动后&#xff0c;将该矩阵的每一行都按照二进制数来解释&a…

厦门大学861语言学考研参考书目

一、考试科目代码及名称 861语言学 二、适用专业 中文系&#xff1a;语言学及应用语言学、汉语言文字学 海外教育学院&#xff1a;语言学及应用语言学、对外汉语教学 三、参考书目 1.《古代汉语》王力&#xff0c;中华书局&#xff0c;2000年。&#xff08;非计算语言学专业…

**Leetcode 861. Score After Flipping Matrix

先写的状压&#xff0c;因为数据说只有<20 然后挂了。。 贪心 class Solution { public:int matrixScore(vector<vector<int>>& A) {if (!A.size() || !A[0].size()) return 0;for (int i 0; i < A.size(); i) {if (!A[i][0]) {for (int j 0; j <…

银灰的拳击机器人_iRobot 861扫地机器人正面外观_iRobot Roomba 861_家电小家电-中关村在线...

●外观(正面) iRobot 861扫地机器人外包装以白色为主色调&#xff0c;风格简约&#xff0c;包装正面标明了产品的外观和型号&#xff0c;让人一目了然。 iRobot 861扫地机器人外包装 主机颜色采用银灰色黑色的美式经典搭配&#xff0c;整体机器是传统的圆形&#xff0c;圆润的体…

leetcode 861.翻转矩阵后的得分

leetcode 861.翻转矩阵后的得分 题目描述 有一个二维矩阵 A 其中每个元素的值为 0 或 1 。 移动是指选择任一行或列&#xff0c;并转换该行或列中的每一个值&#xff1a;将所有 0 都更改为 1&#xff0c;将所有 1 都更改为 0。 在做出任意次数的移动后&#xff0c;将该矩阵…

Codeforces 861 A k-rounding 数论

题目链接&#xff1a; http://codeforces.com/contest/861/problem/A 题目描述&#xff1a; 给你一个n, 一个k, 让你求n的所有倍数至少以k个0结尾的那个数 解题思路&#xff1a; 质因数分解出2&#xff0c; 5&#xff0c; 如果min(cnt2, cnt5) > k, 直接输出&#xff0c; 剩…