首页 > 其他分享 >【LeetCode数组#5行为模拟】螺旋矩阵II

【LeetCode数组#5行为模拟】螺旋矩阵II

时间:2023-01-09 09:11:39浏览次数:71  
标签:遍历 nums int 矩阵 II ++ conut LeetCode

螺旋矩阵II

力扣题目链接(opens new window)

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3 

输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

img

初见思路

说实话没什么思路,唯一的思路就是找规律

但是只能找到一个:数组长度=n,没了

常规思路

本体为常见面试题,不涉及算法

从题目要做的事情来看,就是要模拟一个转圈的过程

也就是行为模拟题

易错点就是:如何处理转圈过程中的边界问题

一种错误思路是,在处理关键点位(如正方形的四个顶点)时,使用了不一样的标准。

例如遍历最上面的第一条边时,处理了该边上的两个顶点,到了遍历正方形左边的时候,应该跳过一个顶点再处理,此时有可能没跳或者跳多了,导致后面处理逻辑乱掉。

引入循环不变量原则

即在遍历时坚持一种规则,比如左闭右开【详见二分查找思路】,逻辑如下:

o_230109005611_image-20230108162219492

解题模板

核心方法就是4个for循环,注释都在代码里了,自己看

有个注意点是:在前两条边转完之后,从底边转到左侧边的过程中,结束条件就记住左闭右开,最后一个点不处理就可以推出来

Java版
ps:

1、初始化变量的时候不要像C++那样连着写

2、Java取模判断奇偶n % 2 == 1 ? "是奇数" : "是偶数"

class Solution {
    public int[][] generateMatrix(int n) {
        /*
        int startIndex = 0;//也可以这样写,考虑到正方形矩阵,这俩值是相同的,所以可以只用一个变量表示
         */
        int[][] nums = new int[n][n];//定义正方形矩阵 
        int startX = 0;//起始位置变量
        int startY = 0;
        int stop = 1;//控制遍历终止位置的变量
        int conut = 1;//数组应该填充的值的计数变量
        int looptimes = n/2;//循环的圈数,例如n为奇数3,那么looptimes = 1 只是循环一圈,矩阵中间的值需要单独处理
        int midIndex = n/2;//当n为奇数时,矩阵中间的值的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
        
        //遵循左闭右开的规则进行遍历
        //i控制纵向,j控制横向,通过四个循环不断遍历填充数组
        int i, j;
        while(looptimes-- > 0){
            for(j = startX; j < n - stop; j++){//模拟上侧从左到右
                nums[startX][j] = conut++;
            }
            //
            for(i = startY; i < n - stop; i++){//模拟右侧从上到下
                nums[i][j] = conut++;
            }
            //注意这里不再需要对i、j进行初始化
            //因为经过一轮遍历,i和j都已经取到最大值
            for(;j > startX; j--){//模拟底侧从右到左,停止条件是大于起始点位,因为最后一个点不处理
                nums[i][j] = conut++;//i不变,j在减
            }

            for(;i > startY; i--){//模拟左侧从下到上
                nums[i][j] = conut++;//i在减,j不变
            }

            //转完一圈,起始位置加1,[0,0]->[1,1]
            startX++;
            startY++;
            //终止位置肯定要提前,体现在变量上就是变量增大
            stop++;

        }
        
        //为了防止n为奇数,遍历到最后中间会留下一个空的情况,需要单独进行处理
        if(n % 2 == 1){
            nums[midIndex][midIndex] = conut;
        }
        
        return nums;
    }
}

Python版

标签:遍历,nums,int,矩阵,II,++,conut,LeetCode
From: https://www.cnblogs.com/DAYceng/p/17035983.html

相关文章

  • [2185] LeetCode 刷题笔记: 统计包含给定前缀的字符串 [s]
    [2185]LeetCode刷题笔记:统计包含给定前缀的字符串[s]目录[2185]LeetCode刷题笔记:统计包含给定前缀的字符串[s]题目描述题解参考简单模拟复杂度分析参考题解C/C++......
  • [1] LeetCode 刷题笔记: 两数之和 [S]
    [1]LeetCode刷题笔记:两数之和[S]目录[1]LeetCode刷题笔记:两数之和[S]题目描述题解参考暴力枚举复杂度分析使用哈希表复杂度分析参考题解C/C++的相关参考Rust......
  • 矩阵乘法与其运用
    矩阵乘法与其运用(logn递推)规则:1.当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。\[\left(\begin{matrix}1&2&3\\4&5&6\\\end{matrix}\right)*......
  • leetcode-230. 二叉搜索树中第K小的元素
    dfs中序遍历即可/***Definitionforabinarytreenode.*typeTreeNodestruct{*Valint*Left*TreeNode*Right*TreeNode*}*/var......
  • leetcode-671. 二叉树中第二小的节点
    dfs取左右子树第二大的值进行比较/***Definitionforabinarytreenode.*typeTreeNodestruct{*Valint*Left*TreeNode*Right*TreeNod......
  • leetcode-2185. 统计包含给定前缀的字符串
    简单题,重拳出击funcprefixCount(words[]string,prefstring)int{validCnt:=0for_,w:=rangewords{notValid:=falseiflen(w)......
  • leetcode-409-easy
    LongestPalindromeGivenastringswhichconsistsoflowercaseoruppercaseletters,returnthelengthofthelongestpalindromethatcanbebuiltwiththose......
  • leetcode-345-easy
    ReverseVowelsofaStringGivenastrings,reverseonlyallthevowelsinthestringandreturnit.Thevowelsare'a','e','i','o',and'u',andtheycan......
  • leetcode-643-easy
    MaximumAverageSubarrayIYouaregivenanintegerarraynumsconsistingofnelements,andanintegerk.Findacontiguoussubarraywhoselengthisequalto......
  • leetcode-496-easy
    NextGreaterElementIThenextgreaterelementofsomeelementxinanarrayisthefirstgreaterelementthatistotherightofxinthesamearray.Youar......