首页 > 其他分享 >LeetCode.螺旋矩阵问题

LeetCode.螺旋矩阵问题

时间:2023-06-02 23:13:05浏览次数:42  
标签:right bottom int top 螺旋 矩阵 数组 LeetCode left

LeetCode54 螺旋矩阵

image-20220708211259147

思路

就是说,给我们一个二维数组,然后我们需要按顺时针的顺序遍历二维数组,然后把每一个遍历到的数据放到一个一维数组中,最后返回这个一维数组

思路很简单,关键是怎么控制让他顺时针去访问,什么时候向下走

什么时候向左走,什么时候向右走 等问题

如图分析:

image-20220708211716453

但是此时还会存在问题

因为此题给的是 m*n 的矩阵不一定是正方形

因为不是正方形,边界的长和宽本来就不相同,在顺时针遍历的时候,可能某一次遍历完,已经遍历完所有元素了,但是由于参数的原因还会继续向后走。

解决方法:因此我们每走完一步都要判断是不是已经走完了 m*n个元素,如果是,那么直接提前break即可。

如下图所示:image-20220708212107746

  • 此时是第二轮从left->right的遍历,此时top=1,left=1,right=2,bottom=1

  • 这一次遍历之后,top++,变成2,下一次right不变,从top->bottom

    因为top>bottom 所以不会进入

  • 然后right--,变成1,下一次bottom不变,right->left 。

  • right=1,left=1,会进入 right->left的循环 而此时所有的元素都已经放入了目标的一维数组,所以此时进入循环 就会重复访问。

    但是此时 如果是正方形,right一定是小于left的,因为正方形的边界都相同,每一轮之后,边界都等大的缩小1,但是由于是长方形,可能本来长就大于宽,因此出现了这种情况

代码

int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
    //总的元素个数
    int total=matrixSize*matrixColSize[0];
    //目前访问到的元素个数
    int count=0;
    //开辟排序后的数组
    int* order=(int*)malloc(sizeof(int)*total);
    int left=0;//左边界
    int top=0;//上边界
    int right=matrixColSize[0]-1;//右边界
    int bottom=matrixSize-1;//下边界
    //遍历的初始坐标为[top,left](0,0)
    //top和bottom表示行坐标,left和right表示列坐标
    //遍历原数组
    while(count<total)
    {
        //top行固定 left->right
        for(int i=left;i<=right;i++)
        {
            if(count==total)
                break;
            order[count++]=matrix[top][i];
        }
        top++;//缩小上边界
        //right列固定,top->bottom
        for(int i=top;i<=bottom;i++)
        {
            if(count==total)
                break;
            order[count++]=matrix[i][right];
        }
        right--;//缩小右边界
        //bottom固定,right->left
        for(int i=right;i>=left;i--)
        {
            if(count==total)
                break;
            order[count++]=matrix[bottom][i];
        }
        bottom--;//缩小下边界
        //left固定,bottom->top
        for(int i=bottom;i>=top;i--)
        {
            if(count==total)
                break;
            order[count++]=matrix[i][left];
        }
        left++;//缩小左边界

        //来到此就要上去进行内层的一圈,由于上下左右边界都进行了调整
        // 所以下一次还是从 [top,left]开始
    }
    *returnSize=total;
    return order;
}

LeetCode59 螺旋矩阵Ⅱ

image-20220708213345328

思路

  1. 定义一个n*n的二维数组
  2. 从外层到内层,按照顺时针顺序依次把 从1到n^2的数放入数组
  3. 循环判断条件是 count<=n*n

注意事项

  • *returnColumnSizes每一行多少列是一个数组 以二级指针的形式传递进来(一维数组的地址)。这个数组 需要自己malloc,然后赋值 第i行有多少列

  • *returnSize 是一个数组,返回的是二维数组的行数的大小

代码

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
    //开辟一个数组 返回每行多少列
    *returnColumnSizes=(int*)malloc(sizeof(int)*n);
    //malloc一个二维数组
    int** array=(int**)malloc(sizeof(int*) *n);
    for(int i=0;i<n;i++)
    {
        array[i]=(int*)malloc(sizeof(int)*n);
        (*returnColumnSizes)[i]=n;
    }
    //返回元素的大小:行
    *returnSize=n;
    int count=1;//最初的值
    int total=n*n;
    //定义上下左右边界
    int left=0;
    int top=0;
    int right=n-1;
    int bottom=n-1;

    //开始向二维数组中填数字
    while(count<=total)
    {
        //top不变,left->right
        for(int i=left;i<=right;i++)
        {
            array[top][i]=count;
            count++;
        }
        //上边界缩小
        top++;
        //right不变,top->bottom
        for(int i=top;i<=bottom;i++)
        {
            array[i][right]=count;
            count++;
        }
        //右边界缩小
        right--;
        //bottom不变,right->left
        for(int i=right;i>=left;i--)
        {
            array[bottom][i]=count;
            count++;
        }
        //下边界缩小
        bottom--;
        //left不变,bottom->top
        for(int i=bottom;i>=top;i--)
        {
            array[i][left]=count;
            count++;
        }
        //左边界缩小
        left++;

        //回到上面 进入内层
    }

    return array;
}

标签:right,bottom,int,top,螺旋,矩阵,数组,LeetCode,left
From: https://www.cnblogs.com/yKng-o3/p/17453084.html

相关文章

  • 非监督异常点检测算法总结——没有想到矩阵分解和编码解码器也是一种思路
    非监督异常点检测算法总结 一、基于密度1) d(p,o):两点p和o之间的距离;2)k-distance:第k距离 对于点p的第k距离dk(p)定义如下:p的第k距离,也就是距离p第k远的点的距离,如图。  3)k-distanceneighborhoodofp:第k距离邻域 点p的第k距离邻域Nk(p),就是p的第k距离即以内的所有点,包括......
  • leetcode2352哈希表的键可以是一个容器等类型
    map<vector<int>,int>cnt;//用于存储每个行向量出现的次数for(autorow:grid){//直接遍历行向量cnt[row]++;}for(inti=0;i<n;++i){vector<int>arr;for(intj=0;j<n;++j){//存储列向量arr.emplace_back(grid[j][i]);}if(cnt.find(arr)!=cnt.......
  • leetcode2352二维vector的操作
    对于二维vector有分外层和内层:当初始化指定了外层大小(行数)时,添加元素写法:错误写法:不能使用[]vector<vector<int>>v(3);//指定外层数目for(inti=0;i<3;++i){for(intj=0;j<n;++j){v[i][j]=0;}}正确写法:vector<vector<int>>v(3);//指定外层数目......
  • Solution Set - 矩阵加速
    A[洛谷P4719]一棵树,点有权,单点修改,求最大权独立集。B[洛谷P6021]一棵树,点有权,单点修改,求在某棵子树中选出一些点,使得所有叶子与根不连通的最小权值和。C[洛谷P5024]一棵树,点有权,给定某两个点的选择状况,求最小权覆盖集。动态DP:(通常在树上)用矩阵刻画DP转移。做树链剖分,然后对每......
  • Leetcode 2559. 统计范围内的元音字符串数
    题目:给你一个下标从0开始的字符串数组words以及一个二维整数数组queries。每个查询queries[i]=[l,r]会要求我们统计在words中下标在l到r范围内(包含这两个值)并且以元音开头和结尾的字符串的数目。返回一个整数数组,其中数组的第i个元素对应第i个查询的答案......
  • 动态规划基础之矩阵取数问题 51nod1083
    题目地址:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1083题目:1083 矩阵取数问题基准时间限制:1 秒空间限制:131072 KB分值: 5 难度:1级算法题例如:3*3的方格。133213221......
  • ACM暑假训练 中石油oj 3737: 礼物(矩阵快速幂)
    3737:礼物时间限制:5Sec  内存限制:512MB提交:46  解决:12[提交][状态][讨论版]题目描述热情好客的小猴请森林中的朋友们吃饭,他的朋友被编号为1∼N,每个到来的朋友都会带给他一些礼物:香蕉。其中,第一个朋友会带给他1个香蕉,之后,每一个朋友到来以后,都会带给他之前所有......
  • 最大子矩阵和问题 动态规划 51nod1051
    1051 最大子矩阵和基准时间限制:2 秒空间限制:131072 KB分值: 40 难度:4级算法题例如:3*3的矩阵:-13-12-13-312和最大的子矩阵是:3-1-1312Input......
  • 一图归纳三大种类矩阵范数:诱导范数,元素范数,Schatten范数,涵盖谱范数,2范数
    转载自:https://blog.csdn.net/qq_27261889/article/details/87902480......
  • LeetCode 236_ 二叉树的最近公共祖先
    classSolution{public:vector<TreeNode*>path1,path2;booldfs(TreeNode*root,TreeNode*p,vector<TreeNode*>&path){if(!root)returnfalse;if(root==p||dfs(root->left,p,path)||dfs(root->right,p,path))......