【算法系列-数组】螺旋矩阵(模拟)

【算法系列-数组】螺旋矩阵(模拟)

文章目录

  • 【算法系列-数组】螺旋矩阵(模拟)
    • 1. 螺旋矩阵II(LeetCode 59)
      • 1.1 思路分析🎯
      • 1.2 解题过程🎬
      • 1.3 代码示例🌰
    • 2. 螺旋矩阵(LeetCode 54)
      • 2.1 思路分析🎯
      • 2.2 解题过程🎬
      • 2.3 代码示例🌰
    • 3. 螺旋遍历二维数组(剑指Offer 146)
      • 3.1 思路分析🎯
      • 3.2 代码示例🌰

1. 螺旋矩阵II(LeetCode 59)

【题目链接】

1.1 思路分析🎯

这道题通过模拟解题,同时需要遵守循环不变量,明确好每一(行/列)走完时的边界值,如下:

  1. 左上到右上,不包括右上,右上交给下一轮开头;
  2. 右上到右下,不包括右下,右下交给下一轮开头;
  3. 右下到左下,不包括左下,左下交给下一轮开头;
  4. 左下到左上,不包括左上,此时一圈已结束;

在这里插入图片描述

若传进来的n为奇数,则最后中间都会剩一个空,此时将直接赋值arr [n / 2][n / 2] = count即可;

1.2 解题过程🎬

初始化 x为矩阵行首,y为矩阵列首 offset用来计算每次拐弯时的边界值,即每次循环都不取每行/每列的边界值,交给下一层循环作起始值,每一圈结束后offset需要 + 1; 圈数 q = n / 2,每次循环结束q–;

进入while循环,表示开始新一圈的赋值,之后通过四个for循环对矩阵的四条边进行赋值,直到四次循环结束,矩阵行首 x + 1,矩阵列首 y + 1, offset + 1,圈数 q - 1,重复上述过程直到q 为 0; 若 n 为 奇数,表示最后矩阵中间会单独剩下一个位,直接赋值即可

1.3 代码示例🌰

class Solution {public int[][] generateMatrix(int n) {int x = 0;int y = 0;int[][] arr = new int[n][n];int offset = 1;int count = 1;int i = 0, j = 0;int q = n / 2, mid = n / 2;while (q > 0) {j = y;i = x;for (;j < n - offset;j++) {arr[i][j] = count++;}for (;i < n - offset;i++) {arr[i][j] = count++;}for (;j > y;j--) {arr[i][j] = count++;}for (;i > x;i--) {arr[i][j] = count++;}x++;y++;offset++;q--;}if (n % 2 == 1) {arr[mid][mid] = count++;}return arr;}
}

2. 螺旋矩阵(LeetCode 54)

【题目链接】

2.1 思路分析🎯

这道题的解法与上道题目(螺旋矩阵II)存在一些区别,区别在于这道题:每次循环都取每行/每列最后的边界值,即做到每一轮的最后边界值在下一轮的开始都不会使用:

在这里插入图片描述

2.2 解题过程🎬

定义好初始数据:

l: 最左边界值

r: 最右边界值

t: 最上边界值

b:最下边界值

之后进入循环,在循环中依次进行理论循环移动:

从左到右:让索引 i = l,从左到右遍历直到 i > r,结束此轮遍历,同时 ++t,最上边界值向下移动一格并进行判断,若 t > b 则退出主循环;

从上到下:让索引 i = t,从上到下遍历直到 i > b,结束此轮遍历,同时 --r,最右边界值向左移动一格并进行判断,若 r < l 则退出主循环;

从右到左:让索引 i = r,从右到左遍历直到 i < l,结束此轮遍历,同时 --b,最下边界值向上移动一格并进行判断,若 b < t 则退出主循环;

从下到上:让索引 i = b,从下到上遍历直到 i < t,结束此轮遍历,同时 ++l,最左边界值向右移动一格并进行判断,若 l > r 则退出主循环;

直到主循环退出,返回收集好数据的列表即可

2.3 代码示例🌰

class Solution {public List<Integer> spiralOrder(int[][] matrix) {if (matrix.length == 0) {return new ArrayList<Integer>();}int t = 0, b = matrix.length - 1, l = 0, r = matrix[0].length - 1;List<Integer> list = new ArrayList<>();while (true) {for (int i = l;i <= r;i++) {list.add(matrix[t][i]);}if (++t > b) {break;}for (int i = t;i <= b;i++) {list.add(matrix[i][r]);}if (--r < l) {break;}for (int i = r;i >= l;i--) {list.add(matrix[b][i]);}if (--b < t) {break;}for (int i = b;i >= t;i--) {list.add(matrix[i][l]);}if (++l > r) {break;}}return list;}
}

3. 螺旋遍历二维数组(剑指Offer 146)

【题目链接】

3.1 思路分析🎯

这道题的解题思路与上道题(螺旋矩阵)基本一致

3.2 代码示例🌰

class Solution {public int[] spiralArray(int[][] array) {if (array.length == 0) {return new int[0];}int t = 0, b = array.length - 1, l = 0, r = array[0].length - 1;int[] arr = new int[(b + 1) * (r + 1)];int x = 0;while (true) {for (int i = l;i <= r;i++) {arr[x++] = array[t][i];}if (++t > b) {break;}for (int i = t;i <= b;i++) {arr[x++] = array[i][r];}if (--r < l) {break;}for (int i = r;i >= l;i--) {arr[x++] = array[b][i];}if (--b < t) {break;}for (int i = b;i >= t;i--) {arr[x++] = array[i][l];}if (++l > r) {break;}}return arr;}
}

以上便是对螺旋矩阵类型题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用ssm实现基于web的网站的设计与实现+vue

TOC ssm756基于web的网站的设计与实现vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范…

极端天气道路目标检测数据集 3400张 带标注 VOC YOLO 6类

分类名: (图片张数&#xff0c;标注个数) car: (3210&#xff0c; 13654) truck: (1168&#xff0c;1629) per son: (1517&#xff0c;4359) bicyc le: (334, 589) bus: (381&#xff0c; 439) motorcycle: (164, 214) 总数: (3404, 20884) 总类(nc): 6类 极端天气道路目标检测…

09_OpenCV彩色图片直方图

import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inlineimg cv2.imread(computer.jpeg, 1) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.show()plot绘制直方图 plt.hist(img.ravel(), 256) #ravel() 二维降一维 256灰度级…

pycharm汉化插件无法使用也无法卸载的解决方法

pycharm汉化插件无法使用也无法卸载的解决方法 本文目录&#xff1a; 一、故障描述 二、故障解决 零、时光宝盒 学习没有可能一帆风顺&#xff0c;我们都是在不断遇到的各种突发问题&#xff0c;不断努力解决的过程中成长。 前几天&#xff0c;我发现家里的网络晚上12点左右开…

初识算法 · 双指针(3)

目录 前言&#xff1a; 和为s的两数之和 题目解析&#xff1a; ​编辑 算法原理&#xff1a; 算法编写&#xff1a; 三数之和 题目解析 算法原理 算法编写 前言&#xff1a; 本文通过介绍和为S的两数之和&#xff0c;以及三数之和&#xff0c;对双指针算法进行深一步…

欧科云链OKLink相约TOKEN2049:更全面、多元与安全

过去几日&#xff0c;OKLink 与全球 Web3 从业者与爱好者们相约狮城。在多场激动人心的活动上分享了我们的产品进展、有关于链上数据的专家观点以及打磨产品的经验。同时也听到了很多来自行业的宝贵声音。跟随我们的脚步&#xff0c;捕捉这充实一周的精彩瞬间&#xff1a; 1、…

netty之基础aio,bio,nio

前言 在Java中&#xff0c;提供了一些关于使用IO的API&#xff0c;可以供开发者来读写外部数据和文件&#xff0c;我们称这些API为Java IO。IO是Java中比较重要知识点&#xff0c;且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能&#xff0c;目前有三种IO共…

5G NR SSB简介

文章目录 SSB介绍SSB波束扫描 SSB介绍 5G NR 引入了SSB 这个概念&#xff0c;同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB) 它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH…

【分页】Spring Boot 列表分页 + javaScript前台展示

后端&#xff1a; 准备好查询实体与分页实体 1、分页工具实体 package com.ruoyi.dms.config;import com.alibaba.nacos.api.model.v2.Result; import lombok.Data;import java.io.Serializable; import java.util.List;/*** author 宁兴星* description: 列表返回结果集*/ …

【10】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-泛型基础全解(泛型函数、泛型接口、泛型类)及参数、接口补充

序言&#xff1a; 本文详细讲解了关于ArkTs语言中的泛型&#xff0c;其中包含泛型函数、泛型接口、泛型约束、泛型类及其中参数的使用方法&#xff0c;补充了一部分接口相关的知识&#xff0c;包括接口的继承和具体实现&#xff0c;也写到了一些边边角角的小知识&#xff0c;剩…

详细介绍:API 和 SPI 的区别

文章目录 Java SPI (Service Provider Interface) 和 API (Application Programming Interface) 的区别详解目录1. 定义和目的1.1 API (Application Programming Interface)1.2 SPI (Service Provider Interface) 2. 使用场景2.1 API 的应用场景2.2 SPI 的应用场景 3. 加载和调…

jmeter学习(1)线程组与发送请求

1、线程组 执行顺序 &#xff1a;setUp线程组 > 线程组 > tearDown线程组 2、 发送请求 可以发送http、java、dubbo 请求等 下面讲解发送http 1&#xff09;Http请求默认值 作用范围是该线程组下的所有HTTP请求&#xff0c;如果http请求设置的与默认值冲突&#xff0…

PC端微信小程序如何调试?

向往常一样运行开微信小程序开发者工具 如果只弹出pc端小程序&#xff0c;没有出现调试的界面&#xff1a;点击胶囊按钮的三个…选择重新进入小程序 即可依次展开相应的功能调试&#xff0c;改完代码没反应再刷新看看&#xff0c;再没反应就再次重新点击编译并自动调试。

【学习笔记】手写 Tomcat 六

目录 一、线程池 1. 构建线程池的类 2. 创建任务 3. 执行任务 测试 二、URL编码 解决方案 测试 三、如何接收客户端发送的全部信息 解决方案 测试 四、作业 1. 了解工厂模式 2. 了解反射技术 一、线程池 昨天使用了数据库连接池&#xff0c;我们了解了连接池的优…

DSPy101

DSPy 介绍 DSPy&#xff08;Declarative Self-improved Language Programs in Python&#xff09; 是一个用于系统化和增强在流水线内使用语言模型的框架&#xff0c;它通过数据驱动和意图驱动的系统来优化大型语言模型&#xff08;LLM&#xff09;的使用。 DSPy 的核心是模块…

C语言的内存结构

在电脑中C语言编译器也像其他软件一样占用一块内存空间。 为了更好的利用好这块内存&#xff0c;C语言将他们分为 在C语言中&#xff0c;变量定义的位置不一样&#xff0c;那么在内存中所处的位置也是不一样的。&#xff08;变量在函数内部是存储在栈里&#xff0c;而在函数外部…

闯关训练三:Git 基础知识

任务1: 破冰活动&#xff1a;自我介绍 点击Fork目标项目&#xff0c;创建一个新的Fork 获取仓库链接 在连接好开发机的vscode终端中逐行执行以下代码&#xff1a; git clone https://github.com/KelvinIII/Tutorial.git # 修改为自己frok的仓库 cd Tutorial/ git branch -a g…

Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进

作者&#xff1a;席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑&#xff0c;从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助&#xff01; Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称&#xff0c;定位于一个更易于构建云原…

Android SystemUI组件(11)SystemUIVisibility解读

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节思维导图&#xff0c;主要关注左侧最上方SystemUiVisibility解读部分即可。 本章节主要讲解SystemUiVisibility的概念及其相…

LeetCode从入门到超凡(四)深入浅出理解贪心算法

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的LeetCode学习总结文档&#xff1b;本文主要讲解贪心算法。&#x1f495;&#x1f495;&#x1f60a; 介绍 贪心算法是一种经典的算法…