IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> leetcode59. 螺旋矩阵 II -> 正文阅读

[游戏开发]leetcode59. 螺旋矩阵 II

方法一

  • 将循环一圈定义为填充一次上、右、下、左。
  • 在循环填充过程中,要定义填充的起点和终点的边界,本解法采用左闭右开的边界。
  • 左闭右开解释:填充上侧时,包含左边界,而不包含右边接;填充右侧时,包含上边界,而不包含下边界;填充下侧时,包含右边界,而不包含左边界;填充左侧时,包含下边界,而不包含上边界。
    在这里插入图片描述
  • 上图每一种颜色代表各自遍历时的长度。
class Solution {
    public int[][] generateMatrix(int n){
		int[][] arr = new int[n][n];

		// 循环模拟次数
		int loop = n / 2;

		// 每次循环的起始位置
		int startX = 0;
		int startY = 0;
		// 控制模拟一圈时,控制上侧和右侧遍历的长度
		int offset = 1;
		int value = 1;

		while (loop > 0) {
			int i = startX;
			int j = startY;

			// 上侧:从左到右,左闭右开的遍历填充
			// 左边右开的意思是:起点闭合,终点打开
			for (; j < startY + n - offset; ++j) {
				arr[i][j] = value++;
			}

			// 右侧:从上到下,左闭右开的遍历填充
			for (; i < startX + n - offset; ++i) {
				arr[i][j] = value++;
			}

			// 下侧:从右到左,左闭右开的遍历填充
			for (; j > startY; j--) {
				arr[i][j] = value++;
			}

			// 左侧:从下到上,左闭右开的遍历填充
			for (; i > startX; i--) {
				arr[i][j] = value++;
			}

			startX++;
			startY++;
			// 由于startX和startY每次循环一圈都要自增1,并且右边界和下边界每次循环一圈都要自减1,因此offset每次都加2
			offset += 2;
			loop--;
		}

		// n为奇数
		if (n % 2 == 1) {
			int mid = n / 2;
			arr[mid][mid] = value;
		}

		return arr;
	}
}

方法2

  • 使用遍历来定义左、右、上、下的边界;
  • 同理,采用左闭右开的规则控制边界。
class Solution {
    public int[][] generateMatrix(int n){
		int[][] arr = new int[n][n];
		// 定义上下左右的边界
		int left = 0;
		int right = n - 1;
		int top = 0;
		int bottom = n - 1;

		int endNum = n * n;
		int value = 1;
		// 采用左闭右开的规则填充
		while (value < endNum) { // value <= endNum会导致n为奇数时无限循环
			int row; // 行
			int culumn; // 列
			// 上侧
			for (culumn = left; culumn < right; culumn++) {
				arr[top][culumn] = value++;
			}
			// 右侧
			for (row = top; row < bottom; row++) {
				arr[row][right] = value++;
			}
			// 下侧
			for (culumn = right; culumn > left; culumn--) {
				arr[bottom][culumn] = value++;
			}
			// 左侧
			for (row = bottom; row > top; row--) {
				arr[row][left] = value++;
			}
			// System.out.println("value = " + value);
			top++;
			right--;
			bottom--;
			left++;
			// System.out.println("left=" + left);
			// System.out.println("ritght=" + right);
			// System.out.println("top=" + top);
			// System.out.println("bottom=" + bottom);
		}
		if (n % 2 == 1) {
			arr[n / 2][n / 2] = value;
		}
		return arr;
	}
}

参考:代码随想录

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:58:26  更:2022-03-15 23:02:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 17:38:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码