首页 > 其他分享 >LeetCode--矩形走位

LeetCode--矩形走位

时间:2023-06-22 20:33:36浏览次数:42  
标签:bottom -- top ++ int 一列 走位 LeetCode left

59. 螺旋矩阵 II

定义一个总数,是所有格子走完中心的最大数,target = n*n

从 1 开始,每走一步,当前数 +1 ,while(curNum<=target) 就继续走

定义每圈螺旋走位的边界,初始值:left=0; right=n-1; top=0; bottom=n-1;

  1、在顶部一行 从左到右走,从 left 走到 right

  由于占了顶部一行,top 要向下缩进一行

  2、在右边一列 从上到下走,从 top 走到 bottom

  由于占了右边一列,right 要向左缩进一列

  3、在底部一行 从右到左走,从 right 走到 left

  由于占了底部一行,bottom 要向上缩进一行

  4、在左边一列 从下到上走,从 bottom 走到 top

  由于占了左边一列,left 要向右缩进一列

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] resMat = new int[n][n];
        int target = n*n;
        int left = 0;
        int right = n-1;
        int top = 0;
        int bottom = n-1;
        int curNum = 1;
        while(curNum <= target) {
            // 在顶部一行,从左走到右
            for (int i=left;i<=right;i++) {
               // 注意这里是 [top][i]
                resMat[top][i] = curNum;
                curNum ++;
            }
            // 从左到右一行走完了,占了上边一行,top 要向下缩进一行
            top++;

            // 在右部一列,从上走到下
            for (int i=top;i<=bottom;i++) {
                // 注意这里是 [i][right]
                resMat[i][right] = curNum;
                curNum ++;
            }
             // 从上到下一列走完了,占了右边一列,right 要向左缩进一列
            right--;

            // 在底部一行,从右走到左
            for (int i=right;i>=left;i--) {
                // 注意这里是 >= left i--
                // 注意这里是 [bottom][i]
                resMat[bottom][i] = curNum;
                curNum ++;
            }
            // 从右到左一行走完了,占了下边一行,bottom 要向上缩进一行
            bottom--;

             // 在左部一列,从下走到上
            for (int i=bottom;i>=top;i--) {
                // 注意这里是 >= top i--
                // 注意这里是 [i][left]
                resMat[i][left] = curNum;
                curNum ++;
            }
             // 从下到上一列走完了,占了左边一列,left 要向右缩进一列
            left++;
        }
        return resMat;
    }
}

 

54. 螺旋矩阵

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

 

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int length = matrix.length;
        int width = matrix[0].length;
        int sum = length*width;
        int left = 0;
        int right = width-1;
        int top = 0;
        int bottom = length-1;
        int i = 0;
        int j = 0;
        int cnt = 0;

        List<Integer> res = new ArrayList<>();
        while(cnt<sum) {
            
            // 在顶部一行
            j=top;
            //从左走到右
            for(i=left;i<=right;i++) {
                res.add(matrix[j][i]);
                //每走一步,计数+1
                cnt++;
            }
            // 在顶部一行,从左走到右,top向下
            top++;
            // 加这个的原因是,因为总数不一定是4的倍数,可能是长方形,所以不一定能走完一个螺旋,就结束了
            if (cnt==sum) {
                break;
            }

            //在右部一列
            i=right;
            //从上走到下
            // 注意这里 top 是已经++ 过的,所以这次走不到 [n,n], 但是前面在顶行走的时候,是 i<=right, 所以会走到[n,n]
            for(j=top;j<=bottom;j++) {
                res.add(matrix[j][i]);
                cnt++;
            }
            //在右部一列,从上走到下,right向左
            right--;
            if (cnt==sum) {
                break;
            }

            //在底部一行
            j=bottom;
            //从右走到左
            for(i=right;i>=left;i--) {
                res.add(matrix[j][i]);
                cnt++;
            }
            //在底部一行,从右走到左,bottom向上
            bottom--;
            if (cnt==sum) {
                break;
            }

            //在左部一列
            i=left;
            //从下走到上
            for(j=bottom;j>=top;j--) {
                res.add(matrix[j][i]);
                cnt++;
            }
            //在左部一列,从下走到上,left向右
            left++;
            if (cnt==sum) {
                break;
            }

        }
        return res;
        
    }
}

 

标签:bottom,--,top,++,int,一列,走位,LeetCode,left
From: https://www.cnblogs.com/suBlog/p/17368297.html

相关文章

  • Java intern函数详解
    先看一个例子如果你会了那这篇文章你没必要看了,如果不会那请看下去,你一定会有收获:Strings=newString("hello");Stringstr1=s+"world";Stringstr3="helloworld";system.out.println(srt1==str3);Strings=newString("hello");Stringstr1=s+&q......
  • UE5 C++ TSet
    概念TSet是一种快速容器类,用于在排序不重要的情况下存储唯一元素TSet也是值类型,支持常规复制、赋值和析构函数操作,以及其元素较强的所有权TSet被销毁时,其元素也将被销毁。键类型也必须是值类型创建TSet<FString>FruitSet;添加元素Add将提供键加入setFruitSet.......
  • Linux 运行jar包的几种方式
    感谢!原文链接:https://blog.csdn.net/qq_42169450/article/details/122688940一、Linux运行jar包的几种方式方式一:java-jarxxx.jar最常用的启动jar包命令,特点:当前ssh窗口被锁定,可按CTRL+C打断程序运行,或直接关闭窗口,程序退出方式二:java-jarxxx.jar&&代表在后......
  • 【环境部署】SPECTER模型-基于transformer的科学出版物
    论文背景标题:SPECTER:Document-levelRepresentationLearningusingCitation-informedTransformers摘要:表示学习是自然语言处理系统的关键组成部分。像BERT这样的最新Transformer语言模型学习了强大的文本表示,但这些模型针对标记和句子级别的训练目标,并不利用相关性信息,这限......
  • linux下根据端口号查询对应进程
    1、命令lsof,以查找占用端口80为例,用法如下:[root@localhostnginx]#lsof-i:80--命令[root@localhostnginx]#--返回什么都没有表示:没有进程占用80端口[root@localhostsbin]#lsof-i:80COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEnginx8246root6uI......
  • 记一次Unable to open nested entry ‘BOOT-INFlib.jar‘. It has been compressed
    感谢原文:https://blog.csdn.net/weixin_38084097/article/details/126479173问题背景前段时间由于工作失误,误将工程项目中某一个依赖包没有添加@loadbalanced注解就直接打包依赖到的主工程中,并发送项目现场测试。出来混的,迟早都要还的。这不,今天就接到项目现场测试部同事投诉,说......
  • 带宽翻倍更能超!影驰HOF Classic D5-7000内存评测:超至7800MHz仍有余力
    一、前言:影驰带来DDR5-7000内存C32时序、1.45V规格亮眼DDR5内存诞生初期被大众吐槽时序高、价格高,甚至表现不如高频DDR4内存,极大地阻碍了其普及,所以Intel12/13代酷睿也同时保留了对DDR4的支持。不过,时隔仅仅一年半,DDR5的这些问题就已经解决得差不多了。现在高频DDR5内存遍地开......
  • cmake简介及基本使用说明
    CMAKE是一个开源、跨平台的编译、测试和打包工具,它使用比较简单的语言描述编译、安装的过程,输出Makefile或者project文件,再去执行构建。在linux环境下编写C++程序是没有类似windows下编译器的一键编译和运行的按钮,只能由开发人员进行手动编译、运行;当多人协同开发一个较大的项目......
  • css3
    CSS3概述CSS3是CSS2的升级版本,它在CSS2的基础上,新增了很多强大的新功能,从而解决一些实际面临的问题。CSS3在未来会按照模块化的方式去发展:CSSCSS3的新特性如下:新增了更加实用的选择器,例如:动态伪类选择器、目标伪类选择器、伪元素选择器等等。新增了更好的视觉效果,例如:圆角......
  • nacos配置
       ......