首页 > 其他分享 >LeetCode59.螺旋矩阵II

LeetCode59.螺旋矩阵II

时间:2023-09-11 22:32:09浏览次数:39  
标签:count 遍历 nums ++ 矩阵 LeetCode59 II int --

LeetCode59.螺旋矩阵II

https://leetcode.cn/problems/spiral-matrix-ii/

学习内容

螺旋矩阵题,就是给你一个矩阵的长度n,去返回一个螺旋表示的二维数组。 如n=3时,返回的二维数组为:

123
894
765

解题的关键点,是考虑边界上的点怎么处理,通过遍历圈数+遍历每个边来输出二维数组。

  • 当每次转圈时,要考虑边界上的这个点要怎么处理。是当前遍历的这条边来处理,还是留给下条边来处理;
  • 每处理一条边,对节点的处理规则不同,要去找到循环不变量,对每条边采用相同的处理规则:左闭右开 or 左闭右闭,坚持使用同一规则去处理每一条边。(左闭右开-遍历每条边时,只处理第一个节点,最后一个节点不处理,交给下一次遍历时处理)
  1. 开始时先给出圈数,n是边长,每转一圈边长会减2,减了几次2,就走几圈。因此圈数是n/2:
while (n/2)
  1. 因为遍历每一条边时,起始位置都会变,因此在进行遍历时,也要定义好起始位置。定义要填充的结果值count
startX=0
startY=0
count=1
  1. 除了起始位置,因为每次遍历一圈后,需要向内绕圈,元素会更少,循环次数也会改变。因此需要在遍历前再定义一个变量用来记录循环终止次数。
offset=1
  1. 左闭右开遍历第一条横边。定义好这几个变量后,开始遍历。在二维数组中的表示不同于(x,y)的坐标轴,往右边走是y值变动,因此从startY起始,到n-offset终止。因为我们规定是左闭右开,右边值不取,所以符号是小于。
for j=startY;j<n-offset;j++{
  nums[startX][j]=count++
}
  1. 左闭右开遍历第二条竖边。竖边对应二维数组中改变的是x的值。左闭右开处理开始的初始值,初始值从startX开始,终值仍然是n-offset。遍历竖边的过程中,y的值是固定的。
for i=startX;i<n-offset;i++{
  nums[i][j]=count++
}
  1. 左闭右开遍历第三条横边。这个过程中,j已经走到圈的末尾了,所以无须初始化,同样是第0位交给下一次处理。
for j>startY;j--{
  nums[i][j]=count++
}
  1. 左闭右开遍历第四条竖边。和上个过程一致,无需初始化。
for i>startX;i--{
  nums[i][j]=count++
}
  1. 循环条件改变。起始位置变化,以及缩小了一圈,终止位置也会变化
startX ++
startY ++
offset --
  1. 奇数处理。当n是奇数时,把最后一个值做填充即可。
if n % 2==0{
  nums[startX][startY]=count++
}

代码

func generateMatrix(n int) [][]int {
    startX:=0
    startY:=0
    count:=0
    offset:=1
    // Go语言不支持动态大小的数组。应该使用make函数创建切片来代替
    // var nums [n][n]int
    nums := make([][]int, n) // 二维切片,3行
    for i := range nums {
        nums[i] = make([]int, n) // 每一行4列
    }
    cycle:=n/2
    for cycle > 0{
        i := startX
        j:=startY
        for j<n-offset{
            count++
            nums[startX][j]=count
            j++
        }
        for i<n-offset{
            count++
            nums[i][j]=count
            i++
        }
        for i < n-offset{
            count++
            nums[i][j] = count
            i++ 
        }
        for j>startY{
            count++
            nums[i][j]=count
            j--
        }
        for i>startX{
            count++
            nums[i][j]=count
            i--
        }
        cycle --
        startX ++
        startY ++
        offset ++
    }
    if n % 2!=0{
        count++
        nums[startX][startY]=count
    }
    return nums
}

go补充

  1. 需要动态创建数组,不能直接使用静态数组创建:var nums [n][n]int
  2. 二维数组的动态创建,需要先创建行,再创建列。动态数组的含义是值可以改变,后续可以填充值。
nums := make([][]int, n) // 二维切片,3行
for i := range nums {
    nums[i] = make([]int, n) // 每一行4列
}
  1. for循环中初始化的值:=是临时变量,后面的for不能再次使用。需要在初始值时进行定义。然后用for循环的while形式解决。

参考:

Golang二维切片初始化 https://studygolang.com/articles/34434

标准代码的改进

  1. 初始化定义非0变量时,用var来定义,可以确定类型;
var loop int = n/2
var center int = n/2
  1. for循环的遍历条件,初始给个定义,第一位用=而不用:=,改变的是该范围内的变量。
i, j := startx, starty
for j = starty; j < n-offset; j++ {
  res[startx][j] = count
  count++
}
  1. for的while写法也可以填三部分值,设置为空即可:
for ; i > startx; i-- {
   res[i][j] = count
   count++
}
func generateMatrix(n int) [][]int {
	startx, starty := 0, 0
	var loop int = n / 2
	var center int = n / 2
	count := 1
	offset := 1
	res := make([][]int, n)
	for i := 0; i < n; i++ {
		res[i] = make([]int, n)
	}
	for loop > 0 {
		i, j := startx, starty

		//行数不变 列数在变
		for j = starty; j < n-offset; j++ {
			res[startx][j] = count
			count++
		}
		//列数不变是j 行数变
		for i = startx; i < n-offset; i++ {
			res[i][j] = count
			count++
		}
		//行数不变 i 列数变 j--
		for ; j > starty; j-- {
			res[i][j] = count
			count++
		}
		//列不变 行变
		for ; i > startx; i-- {
			res[i][j] = count
			count++
		}
		startx++
		starty++
		offset++
		loop--
	}
	if n%2 == 1 {
		res[center][center] = n * n
	}
	return res
}

标签:count,遍历,nums,++,矩阵,LeetCode59,II,int,--
From: https://blog.51cto.com/u_15955938/7439314

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:基本计算器 II
    题目:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。所有中间结果将在 [-231,231 -1] 的范围内。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。 示例1:输入:s=......
  • 什么是项目管理里的需求跟踪矩阵?
     需求跟踪矩阵(RequirementsTraceabilityMatrix,RTM)是项目管理和质量管理中的一个工具,用于跟踪项目需求与其来源以及如何满足这些需求的文档或活动之间的关系。其主要目的是确保项目满足所有定义的需求,同时为相关方提供一个清晰的视图,显示需求如何在项目的......
  • AcWing 5. 多重背包问题 II
    题目有$N$种物品和一个容量是$V$的背包。第$i$种物品最多有$s_i$件,每件体积是$v_i$,价值是$w_i$。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,$N,V$,用空格隔开,分别表示物品种数和背包容积。接下来......
  • 剑指 Offer 56 - II. 数组中数字出现的次数 II
    题目链接:剑指Offer56-II.数组中数字出现的次数II题目描述:在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。解法思路:代码:......
  • 剑指 Offer 57 - II. 和为s的连续正数序列
    题目链接:剑指Offer57-II.和为s的连续正数序列题目描述:输入一个正整数target,输出所有和为target的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。解法思路:双指针:当总和小于target时,j指针向后移动,直到大于或等于停......
  • 【学习笔记】【自学】【模板】矩阵快速幂
    题目描述:给定$n\timesn$的矩阵$A$,求$A^k$。矩阵:一个$m\timesn$的矩阵是一个由$m$行$n$列元素排列成的矩形阵列。即形如$$A=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&......
  • 矩阵
             ......
  • 矩阵快速幂
    矩阵乘法的定义矩阵A*矩阵B=矩阵C                         性质:满足结合律,分配率,但不满足交换律矩阵乘法的特殊情形矩阵A是一个N*N的矩阵,矩阵F是一个N*1的矩阵,设F1=A*F,发现F1也是一个N*1的矩阵,只有一行......
  • 洛谷 P5218 无聊的水题 II
    洛谷传送门无聊的水题。根据裴蜀定理,显然能组合出任意值的充要条件是,选出的数的\(\gcd=1\)。设\(g(i)\)为在\(1\simn\)中选出若干个数使得它们\(\gcd=i\)的方案数,\(f(i)\)为在\(1\simn\)中选出若干个数使得它们\(\gcd\)是\(i\)的倍数的方案数。我们有:\[......
  • 【刷题笔记】45. Jump Game II
    题目Givenanarrayofnon-negativeintegers nums,youareinitiallypositionedatthefirstindexofthearray.Eachelementinthearrayrepresentsyourmaximumjumplengthatthatposition.Yourgoalistoreachthelastindexintheminimumnumberofju......