代码随想录 LeetCode数组篇 螺旋矩阵II Java实现

news2024/11/14 21:53:32

文章目录

  • (中等)59. 螺旋矩阵II
  • (中等)54. 螺旋矩阵
  • (简单)JZ29 顺时针打印矩阵


(中等)59. 螺旋矩阵II

在这里插入图片描述
在这里插入图片描述

因为我是先做的JZ29,所以看到这题的时候,几乎就是一样的题,代码都几乎一样,思路解析在下一节JZ29中
在这里插入图片描述

class Solution {
    public int[][] generateMatrix(int n) {
        int left = 0;
        int right = n - 1;
        int up = 0;
        int down = n - 1;
        int[][] res = new int[n][n];
        int index = 1;
        while (left <= right && up <= down) {
            for (int i = left; i <= right; i++) {
                res[up][i] = index++;
            }
            up++;
            if (up > down) {
                break;
            }
            for (int i = up; i <= down; i++) {
                res[i][right] = index++;
            }
            right--;
            if (left > right) {
                break;
            }
            for (int i = right; i >= left; i--) {
                res[down][i] = index++;
            }
            down--;
            if (up > down) {
                break;
            }
            for (int i = down; i >= up; i--) {
                res[i][left] = index++;
            }
            left++;
            if (left > right) {
                break;
            }
        }
        return res;
    }
}

(中等)54. 螺旋矩阵

在这里插入图片描述
在这里插入图片描述

思路和JZ29是一样的,代码几乎也是一样的

import java.util.ArrayList;
import java.util.List;

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int up = 0;
        int left = 0;
        int down = matrix.length - 1;
        int right = matrix[0].length - 1;
        ArrayList<Integer> list = new ArrayList<>();
        while (left <= right && up <= down) {
            for (int i = left; i <= right; i++) {
                list.add(matrix[up][i]);
            }
            up++;
            if (up > down) {
                break;
            }
            for (int i = up; i <= down; i++) {
                list.add(matrix[i][right]);
            }
            right--;
            if (left > right) {
                break;
            }
            for (int i = right; i >= left; i--) {
                list.add(matrix[down][i]);
            }
            down--;
            if (up > down) {
                break;
            }
            for (int i = down; i >= up; i--) {
                list.add(matrix[i][left]);
            }
            left++;
            if (left > right) {
                break;
            }

        }
        return list;
    }
}

(简单)JZ29 顺时针打印矩阵

在这里插入图片描述
在这里插入图片描述

我的代码

这是一道模拟题,就按照正常思路模拟即可

我用了visit标记数组,标记是否访问过这个位置

使用变量cnt记录当前访问过几个

import java.util.ArrayList;

public class Solution {
    public ArrayList<Integer> printMatrix(int[][] matrix) {

        int x = 0;
        int y = 0;
        int width = matrix[0].length;
        int height = matrix.length;
        int cnt = 0;
        boolean[][] visit = new boolean[height][width];
        ArrayList<Integer> list = new ArrayList<>();
        while (cnt < width * height) {
            while (cnt < width * height && y < width && !visit[x][y]) {
                list.add(matrix[x][y]);
                visit[x][y] = true;
                cnt++;
                y++;
            }
            y--;
            x++;
            while (cnt < width * height && x < height && !visit[x][y]) {
                list.add(matrix[x][y]);
                visit[x][y] = true;
                cnt++;
                x++;
            }
            x--;
            y--;
            while (cnt < width * height && y >= 0 && !visit[x][y]) {
                list.add(matrix[x][y]);
                visit[x][y] = true;
                cnt++;
                y--;
            }
            y++;
            x--;
            while (cnt < width * height && x >= 0 && !visit[x][y]) {
                list.add(matrix[x][y]);
                visit[x][y] = true;
                cnt++;
                x--;
            }
            x++;
            y++;
        }
        return list;
    }
}

牛客官方的代码写的比我这个要更简洁一些

具体做法:

  1. 首先排除特殊情况,即矩阵为空的情况
  2. 设置矩阵的四个边界值,开始准备螺旋遍历矩阵,遍历的截止点是左右边界或者上下边界重合
  3. 首先对最上面一排从左到右进行遍历输出,到达最右边后第一排就输出完了,上边界相应就往下一行,要判断上下边界是否相遇相交
  4. 然后输出到了右边,正好就对最右边一列从上到下输出,到底后最右边一列已经输出完了,右边界就相应往左一列,要判断左右边界是否相遇相交
  5. 然后对最下面一排从右到左进行遍历输出,到达最左边后最下面一排就输出完了,下边界相应就网上一行,要判断上下边界是否相遇相交
  6. 然后输出到了左边,正好就对左边一列从下到上输出,到顶后最左边一列已经输出完了,左边界就相应往右一列,要判断左右边界是否相遇相交
  7. 重复3-6步骤,直到循环结束
import java.util.ArrayList;

public class Solution {
    public ArrayList<Integer> printMatrix(int[][] matrix) {
        ArrayList<Integer> list = new ArrayList<>();
        if (matrix.length == 0) {
            return list;
        }

        //左边界
        int left = 0;
        //右边界
        int right = matrix[0].length - 1;
        //上边界
        int up = 0;
        //下边界
        int down = matrix.length - 1;

        while (left <= right && up <= down) {
            //上边界,从左到右
            for (int i = left; i <= right; i++) {
                list.add(matrix[up][i]);
            }
            up++;
            if (up > down) {
                break;
            }

            //右边界,从上到下
            for (int i = up; i <= down; i++) {
                list.add(matrix[i][right]);
            }
            right--;
            if (left > right) {
                break;
            }

            //下边界,从右到左
            for (int i = right; i >= left; i--) {
                list.add(matrix[down][i]);
            }
            down--;
            if (up > down) {
                break;
            }

            //左边界,从下到上
            for (int i = down; i >= up; i--) {
                list.add(matrix[i][left]);
            }
            left++;
            if (left > right) {
                break;
            }
        }
        return list;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/506734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud入门实战之项目(一)

一、新建父工程 以“下单”需要调“支付”模块为例&#xff0c;从零开始搭建springcloud-001项目&#xff0c;陆续集成相关组件。 新建服务提供者cloud-payment工程&#xff0c;服务调用者cloud-order工程&#xff0c;完成order对payment的调用。 只留下pom文件&#xff0c;其…

基于人工智能AI视频分析的智慧安监解决方案

方案背景 为了保证对园区环境风险进行有效识别&#xff0c;传统视频监控存在视频结构化利用率低的问题&#xff0c;在实际使用过程中&#xff0c;安全管理人员工作效率低下&#xff0c;依靠人工肉眼查看灵活度低&#xff0c;风险漏报概率高&#xff0c;出现异常情况跟踪不及时&…

中文润色神器-中文润色软件

中文写作润色软件 中文写作润色软件是一种基于自然语言处理技术和人工智能算法的工具&#xff0c;旨在提高中文文本的语言风格、表达能力和可读性。它可以自动检测文本中出现的语法、拼写、标点符号等语言问题&#xff0c;并给出相应的修正和修改建议。 中文写作润色软件的主…

paddleLite在Android部署初体验(环境问题)

paddleLite初体验&#xff08;环境问题&#xff09; Android Studio下载Paddle Lite Demo打开项目环境配置下载到手机 Paddle Lite是百度开发的一种方便部署的深度学习推理框架&#xff0c;笔者最近想接触一些模型部署相关项目&#xff0c;就先接触了一下Paddle Lite&#xff0…

手术麻醉信息系统源码 php + mysql + vue2,覆盖患者就诊全过程,体征数据自动采集绘制

手术麻醉信息系统源码 php mysql vue2 B/S网页版 麻醉信息系统是HIS产品的中的一个组成部分&#xff0c;主要应用于医院的麻醉科&#xff0c;属于电子病历类产品。医院麻醉监护的功能覆盖整个手术与麻醉的全过程&#xff0c;包括手术申请与排班、审批、安排、术前、术中和术…

list_for_each_entry()函数分析

在Linux内核源码中&#xff0c;经常要对链表进行操作&#xff0c;其中一个很重要的宏是list_for_each_entry&#xff1a; /*** list_for_each_entry - iterate over list of given type* pos: the type * to use as a loop cursor.* head: the head for your list.* member: t…

9个已开源的GPT4平替分享(附开源代码+论文)

资料整理自网络&#xff0c;有误欢迎指正 对于想要研究大模型的同学来说&#xff0c;目前ChatGPT无疑是最好的学习对象&#xff0c;但等它开源估计是不太可能了&#xff0c;所以学姐今天整理了一些开源的类GPT模型&#xff0c;帮助大家更好的理解大模型背后的机理。 PS&#x…

io,nio,aio区别

文章目录 前言io类型介绍同步阻塞io同步非阻塞ioio多路复用异步io 普通ionioChannelChannel实现基本的 Channel代码 示例 BufferBuffer的基本用法Buffer的capacity,position和limitcapacitypositionlimit Buffer的类型Buffer的分配向Buffer中写数据从Buffer中读取数据 Selector…

CSS 实现任意角度圆环

参考链接&#xff1a; css 制作圆环 - 掘金 主要思路&#xff1a; 利用 CSS 的 clip-path 属性进行裁剪 clip-path 具体信息参考 polygon() - MDN (mozilla.org) 该属性原理是&#xff1a;利用多边形进行对图形的裁剪。 根据具体代码&#xff0c;去分析 clip-path: polyg…

JavaWeb:Servlet、ServletContext、HttpServletResponse、HttpServletRequest 的详细内容

文章目录 JavaWeb - 02一、Servlet1. 简介2. HelloServlet3. Servlet 原理4. Mapping 原理 二、ServletContext1. 共享数据2. 获取初始化参数3. 请求转发4. 读取资源文件 三、HttpServletResponse1. 方法介绍2. 应用&#xff1a;下载文件3. 应用&#xff1a;创建验证码4. 应用&…

office web apps在线office文件预览部署及问题处理

文件下载链接网盘&#xff1a; 链接: https://pan.baidu.com/s/1OmWM5END0jyWESGzFCniEw 提取码: ejpg 基本环境需要两台机&#xff0c;1台为域控&#xff0c;1台为 &#xff08;office web apps &#xff0c;需要加入到域&#xff09; 主机1&#xff1a;添加域控服务 安装完…

设备树简介

设备树 设备树简介 设备树是一种描述硬件的数据结构&#xff0c;它起源于OpenFirmware&#xff08;OF&#xff09;。 在Linux 2.6中&#xff0c; ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx中&#xff0c;采用设备树后&#xff0c;许多硬件…

python操作字典

# 字典 score{"张三":"23","王五":"45"} print(score) dctdict(name张三,age20) print(dict) print(type(score)) # 字典元素的获取 print(score[张三]) print(score.get(张三)) # 判断是否是字典中的元素 print(王五 in score) # 为字…

浅析AI视频智能识别技术如何助力智慧平安校园建设

校园安全一直是学生健康成长、全面发展的前提与保障。校园门口伤害事件的频发与校园内应急事件的突发&#xff0c;让建设平安校园的任务愈加急迫。校园人流量大、监控点多&#xff0c;安保人员无法同时盯住上百个视频画面&#xff0c;亦无法保证24小时有效监控。传统的校园安防…

软件测试简历项目经验怎么写?一篇足矣解决

一、前言&#xff1a;浅谈面试 面试是我们进入一个公司的门槛&#xff0c;通过了面试才能进入公司&#xff0c;你的面试结果和你的薪资是息息相关的。那如何才能顺利的通过面试&#xff0c;得到公司的认可呢?面试软件测试要注意哪些问题呢?下面和笔者一起来看看吧。这里分享一…

OpenGL(十一)——材质

目录 一、前言 二、物体材质 三、光源材质 一、前言 OpenGL材质是模拟现实世界中不同材质物体表面&#xff0c;如木制箱子和钢制箱子对光的反射程度不同。物体材质对接受光散射程度不同&#xff0c;较少散射产生较小高光点&#xff0c;较多散射则会产生较大高光点。前面章节…

如何节约ChatGPT消耗的token

如何节约GPT的token.md 原文链接&#xff1a;小回博客 如何节约GPT的token 一、模拟一下携带上下文的流程&#xff1a; 第1次问答&#xff1a; 你&#xff1a;帮我写一个1000字的文案&#xff08;13&#xff09; gpt: xxxxxx (1000)第2次问答&#xff1a; 你&#xff1a;谢…

《我命由我不由天》蔡志忠——笔记三

目录 经典摘录 1、大脑是用来思考的 2、养生主 3、自己的问题&#xff0c;自己找答案 4、42岁自学英文 5、终身阅读 6、打不垮我们的终究使我们更强大 7、大环境下失业 8、生命只能兑现此刻 经典摘录 1、大脑是用来思考的 罗素非常反对制式教育&#xff0c;他说&#…

有哪些比较好的测试用例管理工具?

“新入职小型创业公司&#xff0c;想要一个比Excel高效且好用的工具。”我预料很多人会提TestLink、Jira、PingCode 等一堆平台&#xff0c;都2023年了&#xff0c;若还是复制粘贴的10年前这一套&#xff0c;那就让人看不下去了。为了让大家少走弯路&#xff0c;所以我写了这篇…