首页 > 其他分享 >LeetCode54. 螺旋矩阵Ⅰ

LeetCode54. 螺旋矩阵Ⅰ

时间:2023-10-16 09:03:48浏览次数:27  
标签:LeetCode54 matrix 螺旋 int 矩阵 startIndex minOne loop

题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例

image
image

提交的代码

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        //行数
        int m=matrix.length;
        //列数
        int n=matrix[0].length;
        //以行数和列数中的较小值除以2来确定需要转几次
        int minOne=Math.min(m,n);
        int loop=minOne/2;
        //每一圈的起始index
        int startIndex=0;
        //每一圈不需要处理的个数
        int offset=1;
        //定义结果List
        List<Integer> result=new ArrayList<Integer>(m*n);
        int i,j;
        //当前需要循环次数的备份
        int loopCopy=loop;
        while(loop>0){
            i=startIndex;
            j=startIndex;
            
            for(;j<n-offset;j++){
                result.add(matrix[i][j]);
            }
            for(;i<m-offset;i++){
                result.add(matrix[i][j]);
            }
            for(;j>=offset;j--){
                result.add(matrix[i][j]);
            }
            for(;i>=offset;i--){
                result.add(matrix[i][j]);
            }

            startIndex++;
            loop--;
            offset++;
        }
        //当minOne为偶数的时候,代表当前已经循环完毕,不存在剩余部分
        if(minOne%2==0){
            return result;
        }
        //当minOne为奇数的时候,代表还存在1*1,1*3,3*1这样的剩余部分
        int remainM=m-loopCopy*2;
        int remainN=n-loopCopy*2;
        if(remainM==remainN){
            //1*1形式的剩余部分
            result.add(matrix[startIndex][startIndex]);
        }else if(remainM>remainN){
            int indexM=startIndex;
            int indexN=startIndex;
            //m*1形式
            for(int y=0;y<remainM;y++,indexM++){
                result.add(matrix[indexM][indexN]);
            }
        }else{
            int indexM=startIndex;
            int indexN=startIndex;
            //1*n形式
            for(int y=0;y<remainN;y++,indexN++){
                result.add(matrix[indexM][indexN]);
            }
        }
        return result;
    }
}

思路

这个题的做法和螺旋矩阵Ⅱ的思想类似,最关键的还是遍历一个二维矩阵使用左闭右开的原则,唯一不同的是计算循环次数loop是根据当前矩阵长和宽相对较短的那一个来计算:int minOne=Math.min(matrix.length,matrix[0].length),loop=minOne/2;最后无法转圈的部分的起始startIndex=minOne/2,然后计算最终剩下的部分的形状矩阵循环遍历就可以解决。

标签:LeetCode54,matrix,螺旋,int,矩阵,startIndex,minOne,loop
From: https://www.cnblogs.com/whitePuPigeon/p/17766593.html

相关文章

  • 1277. 统计全为 1 的正方形子矩阵
    解法1:比较好理解的方式dp[i][j][k]:以(i,j)为右下角,长度为k的正方形是否满足全都为1,满足则为1,不满足则为0我们要做的就是对每个点判断一下它可能长度的正方形是不是以下几个条件:本身是否为1dp[i-1][j][k-1]是否为1dp[i][j-1][k-1]是否为1dp[i-1][j-......
  • LeetCode59. 螺旋矩阵Ⅱ
    题目描述给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例提交的代码classSolution{intmatrixLen=0;publicint[][]generateMatrix(intn){ //初始化空数组int[][]matrix=newint[n][......
  • 矩阵优化dp
    都快csps了,还什么都不会的菜鱼(我估计着马上就可以改了这句话了,成了都快noip了)矩阵我们要用矩阵优化dp,首先要知道矩阵是个什么东西(感觉其实可以不用知道)。矩阵的很多定义啥的都可以选择去oi-wiki上去进行学习。很简单的一堆定义。读者自学不难,这里就不多赘述。矩阵加法就是将......
  • OpenGL入门——矩阵变换与坐标系统
    一、OpenGL的数学库GLM向量和矩阵的运算就不作说明了,直接介绍OpenGL中如何使用矩阵变换。GLM(官网:OpenGLMathematics(g-truc.net))是OpenGL Mathematics的缩写,它是一个只有头文件的库,也就是说只需包含对应的头文件就行了,不用链接和编译。把头文件的根目录复制到项目的includes......
  • 行列式与矩阵树定理
    定义定义矩阵的行列式:\[\detA=\sum_{\sigma}(-1)^{\tau(\sigma)}\prod_{i=1}^nA_{i\sigma_i}\]\(\tau(\sigma)\)是原排列的逆序对数。性质:若矩阵的某一行或某一列全为\(0\),则行列式为\(0\)。\(\detA=\detA^T\)。交换\(A\)的两行或两列,行列式取反。某一行或某一......
  • python_两两比较计算相似矩阵
    距离矩阵余弦距离矩阵余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异点集内或矩阵内两两元素之间的距离矩阵##简单使用两重循环defcompute_squared_EDM_method(X):#获得矩阵都行和列,因为是行向......
  • 代码随想录第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
    977有序数组的平方题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/思路:双指针(实际是三指针),两个找最大值,一个确定平方后的位置。209.长度最小的子数组题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/思路:很像双指针,一个指向子数组开头,一......
  • 【noip赛前20天冲刺集训 day3】矩阵挑战
    NOIP比赛前的冲刺训练-第3天:矩阵挑战问题描述您有一个n×m矩阵,行编号从0到n−1,列编号从0到m−1。最初,第i行第j列的元素是i*m+j。系统支持三种类型的操作:交换两行。交换两列。交换两个特定的元素。任务是确定执行q次操作后矩阵的状态。输入格式为了最小化输......
  • MATLAB矩阵分析
    一、矩阵的基础知识closeall;clearall;clc;%%改变矩阵尺寸a=eye(3);a(2,4)=3;%添加第四列,第二行元素为3,其余为0a(:,4)=3;%添加第四列,元素都是3a(2,:)=[];%删除第二行a(:,2)=[];%删除第二列b=a(1:end);%将矩阵变为行向量,以列为顺序,end表示最后一个元素%%改变矩阵形状......
  • 矩阵连乘问题,生成需要的矩阵
      任务是这样子的:我们先完成txt文本矩阵的准备,大概做了50个矩阵; 代码如下:#include <iostream>#include <fstream>#include <vector>#include <random>#include <string>#include <windows.h> // 包含 Windows API 头文件// 创建文件夹(仅适用于 Window......