首页 > 其他分享 >【剑指 Offer】 29. 顺时针打印矩阵

【剑指 Offer】 29. 顺时针打印矩阵

时间:2023-04-17 12:12:07浏览次数:45  
标签:顺时针 matrix Offer int res 29 -- length 边界

【题目】

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

 

示例 1:

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

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

 

限制:

  • 0 <= matrix.length <= 100
  • 0 <= matrix[i].length <= 100

【思路】

从左到右 上边界--

从上到下 右边界--

从右到左 下边界--

从下到上 左边界--

如果上下左右边界越过了对方,就说明已经结束

【代码】

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length==0) return new int[0];
        int l = 0; //左边界
        int r = matrix[0].length-1; //右边界
        int t = 0; //上边界
        int b = matrix.length-1; //下边界
        List<Integer> res = new ArrayList<>();
        while(true){
            // 从top的左到右 
            for(int i=l;i<=r;i++){
                res.add(matrix[t][i]);
            }
            // 最顶一行遍历完 top要+1表示进入下一层,如果top比bottom大 说明结束了
            if(++t>b) break;

            for(int i=t;i<=b;i++)
                res.add(matrix[i][r]);
           
            if(--r<l) break;

            for(int i=r;i>=l;i--){
                res.add(matrix[b][i]);
            }
            if(--b<t) break;
            for(int i=b;i>=t;i--){
                res.add(matrix[i][l]);
            }
            if(++l>r) break;
        }
        return  res.stream().mapToInt(Integer::intValue).toArray();
    }
}

 

标签:顺时针,matrix,Offer,int,res,29,--,length,边界
From: https://www.cnblogs.com/End1ess/p/17325434.html

相关文章

  • AtCoder Beginner Contest 295
    ThreeDaysAgo我们定义一个只由数字构成的字符串中的字符能够被重排成相同的两份,我们称这个字符串是个好字符串,比如12341234现在给定一个字符串\(S\),找出所有的\([l,r]\),使得在这段区间中的子段是个好字符串题解:思维+组合计数首先我们根据题意得到:一个好字符串中所有相......
  • 题解:【ABC298G】Strawberry War
    题目链接场上被F干碎了,没看见这个典题。原题差不多是这个吧......
  • 【剑指 Offer 】62. 圆圈中最后剩下的数字
    【题目】0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的......
  • ATABC298E Unfair Sugoroku
    ATABC298EUnfairSugoroku(笑)题意有一个长为\(N\)行的棋盘,两枚棋子初始时分别位于\(A\),\(B\)两个位置,分别记为\(a\)与\(b\)。两枚棋子分别对应两枚骰子,分别可以等概率的投掷出\(1\simP\)与\(1\simQ\)的点数,并将其对应的棋子移动到\(\min(N,i+X)\)的位置上......
  • 【剑指 Offer】 57 - II. 和为s的连续正数序列
    【题目】输入一个正整数target,输出所有和为target的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 示例1:输入:target=9输出:[[2,3,4],[4,5]]示例2:输入:target=15输出:[[1,2,3,4,5],[4,5,6],[7,8]] 限制:   1<=target......
  • 剑指 Offer 64. 求1+2+…+n
    题目链接:剑指Offer64.求1+2+…+n方法:逻辑运算符短路原则解题思路例如:对于表达式\(A&&B\),若\(A\)为\(false\),那么就不会计算\(B\);代码classSolution{public:intsumNums(intn){n&&(n+=sumNums(n-1));returnn;}};复杂度......
  • 「解题报告」CF1129D Isolation
    水题,但是调了好久qwq显然是DP,出现次数显然分块,那就数据结构优化DP呗。我们可以维护出当前点到每个点这段区间内有多少个出现次数为\(1\)的数,这个右端点每拓展一位修改的左端点一定是连续的区间。分块维护这个东西,如果是散块暴力重构暴力加,如果是整块那给整块打个加标记。......
  • AtCoder Beginner Contest 293 补题记录 (E-G)
    E题意:给定A,X,M,计算(A0+A1+A2+...+AX-1)modM(1<=A,M<=109,1<=X<=1012)。 根据等比数列求和公式,(A0+A1+A2+...+AX-1)modM=((AX-1)/(A-1))modM。然而,此题如果用求和公式来求解显然是行不通的,下面会给出原因。 如果我们要用求......
  • 剑指 Offer 60. n个骰子的点数
    题目链接:剑指Offer60.n个骰子的点数方法:动态规划解题思路\(n=1\)时可能的和为\([1,6]\),其概率为\(dp[1][]=[1/6,1/6,1/6,1/6,1/6,1/6]\)\(n=2\)时对于第一个骰子为\(1\)时,第二个骰子可以为\([1,6]\),其可以构成的和为\([2,7]\),分别为其中的和\([i+......
  • 【剑指 Offer 】14- I. 剪绳子
    【题目】给你一根长度为n的绳子,请把绳子剪成整数长度的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1]。请问k[0]*k[1]*...*k[m-1]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例1:输入:......