首页 > 其他分享 >【数组】——螺旋矩阵

【数组】——螺旋矩阵

时间:2023-02-09 21:11:49浏览次数:43  
标签:count startx starty 螺旋 int 矩阵 ++ 数组 offset

【数组】——螺旋矩阵

模拟顺时针画矩阵的过程:
1.填充上行从左到右
2.填充右列从上到下
3.填充下行从右到左
4.填充左列从下到上
由外向内一圈一圈这么画下去。每一条边都要遵守同一原则(左闭右开或左开右闭)

// C++版本
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
        int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
        int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
        int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
        int count = 1; // 用来给矩阵中每一个空格赋值
        int offset = 1; // 需要控制每一条边遍历的长度,每次循环右边界收缩一位
        int i,j;
        while (loop --) {
            i = startx;
            j = starty;

            // 下面开始的四个for就是模拟转了一圈
            // 模拟填充上行从左到右(左闭右开)
            for (j = starty; j < n - offset; j++) {
                res[startx][j] = count++;
            }
            // 模拟填充右列从上到下(左闭右开)
            for (i = startx; i < n - offset; i++) {
                res[i][j] = count++;
            }
            // 模拟填充下行从右到左(左闭右开)
            for (; j > starty; j--) {
                res[i][j] = count++;
            }
            // 模拟填充左列从下到上(左闭右开)
            for (; i > startx; i--) {
                res[i][j] = count++;
            }

            // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
            startx++;
            starty++;

            // offset 控制每一圈里每一条边遍历的长度
            offset += 1;
        }

        // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
        if (n % 2) {
            res[mid][mid] = count;
        }
        return res;
    }
};
# python版本
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        nums = [[0] * n for _ in range(n)]
        startx, starty = 0, 0               # 起始点
        loop, mid = n // 2, n // 2          # 迭代次数、n为奇数时,矩阵的中心点
        count = 1                           # 计数
		
        for offset in range(1, loop + 1) :      # 每循环一层偏移量加1,偏移量从1开始
            for i in range(starty, n - offset) :    # 从左至右,左闭右开
                nums[startx][i] = count
                count += 1
            for i in range(startx, n - offset) :    # 从上至下
                nums[i][n - offset] = count
                count += 1
            for i in range(n - offset, starty, -1) : # 从右至左
                nums[n - offset][i] = count
                count += 1
            for i in range(n - offset, startx, -1) : # 从下至上
                nums[i][starty] = count
                count += 1
            startx += 1         # 更新起始点
            starty += 1
			
        if n % 2 != 0 :			# n为奇数时,填充中心点
            nums[mid][mid] = count 
        return nums

标签:count,startx,starty,螺旋,int,矩阵,++,数组,offset
From: https://www.cnblogs.com/z-qhhh/p/17107056.html

相关文章

  • 打乱数组内的值 打乱的本质是交换, 交换不会丢数也不会多数; 循环将 随机下标和本次
    packagecom.fqs.demo;importjava.util.Random;publicclassZhiBoChouJiang{publicstaticvoidmain(String[]args){//打乱数组中的顺序i......
  • JavaScript实现数组对象去重
    有多种实现方式:一、使用Set对象:Array.from(newSet(array))该方法会先创建一个Set对象,然后再使用Array.from方法将Set对象转换为数组,因为Set对象不允许有......
  • c语言填空:两个数组计算
    #include<stdio.h>//求出a中各相邻两个元素的和,并将这些和存放在数组b中//按每行3个元素的形式输出。例如:b[1]=a[1]+a[0],....,b[9]=a[9]+a[8]main(){inta[10......
  • 【js】数组:filter函数
    前言:在使用filter的时候,永远返回的是一个“被筛选后的”新数组  1、定义 filter() 用于过滤某些元素,如果有if判断,if中往往返回的是true或false(布尔值)2、使用fil......
  • 将二维数组作为函数参数
    今天本来正在写一个稀疏数组的代码,要写的内容很简单,创建一个11x11的数组,将其中两个位置分别赋值为1、2,其余位置为0。然后输出数组看一下是否赋值正确。正常是很简单的事情......
  • 一个大数组根据特定大小分割为多个小数组
    1.Using Skip() and Take()的普通方法usingSystem;usingSystem.Linq;usingSystem.Collections.Generic;publicstaticclassExtensions{publicstat......
  • 连续数组
    给定一个二进制数组 nums ,找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。/***@param{number[]}nums*@return{number}*/constf......
  • 4.4 数组是高效使用内存的基础
    数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数组元素的各个数据会通过连续的编号被区分开来,这个编号称为索引(index)。指定索引后,就可以对该索引所对应地......
  • C语言填空:数组 最大值 最小值
    #include<stdio.h>//输入5个1-9之间的整数,输出其中的最大值和最小值main(){inta[5],i,j,temp,【1】;for(i=0;i<5;i++)scanf("%d",&a[i]);for(i......
  • python多维数组的每列的最值
    python代码实现importnumpyasnpdefmaxmin(array):#求每列的最值maxlist=[]minlist=[]foriinrange(len(array[0])):#行数col=[]......