算法题总结(四)——螺旋矩阵

螺旋矩阵

59、螺旋矩阵二

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

示例 1:

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

示例 2:

输入:n = 1
输出:[[1]]

就是模拟:

1、从左到右遍历,上边界++,如果上边界大于下边界,结束循环。

2、从上到下遍历,右边界–,如果右边界小于左边界,结束循环。

3、从右到左遍历,下边界–,如果下边界小于上边界,结束循环。

4、从下到上遍历,左边界++,如果左边界大于右边界,结束循环。

class Solution {
    public int[][] generateMatrix(int n) {

        int[][] res = new int[n][n];
        int l=0,r=n-1,u=0,d=n-1;  //上下左右边界赋值
        int count=1;
        while(true)
        {
            for(int i=l;i<=r;i++)    //每一个方向后 移动一次!
            res[u][i]=count++; 
            u++;    //重新设定上边界,若上边界大于下边界,则遍历遍历完成,下同
            if(u>d) break;  
            for(int i=u;i<=d;i++)
            res[i][r]=count++;  
            r--; //重新设定右边界
            if(r<l) break; 
            for(int i=r;i>=l;i--)
            res[d][i]=count++;   
            d--;  //重新设定下边界
            if(d<u) break;    
            for(int i=d;i>=u;i--)
            res[i][l]=count++;
            l++;    //重新设定左边界
            if(l>r) break;
        }
        return res;        
    }
}

#54、螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 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]
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int m=matrix.length;
        int n=matrix[0].length;

        List<Integer> result =new ArrayList<>();

        int l=0,r=n-1,u=0,d=m-1;
        while(true)
        {
            for(int i=l;i<=r;i++)
            {
                result.add(matrix[u][i]);
            }
            if(++u>d)   break;
            for(int i=u;i<=d;i++)
            {
                result.add(matrix[i][r]);
            }
            if(--r<l) break;
            for(int i=r;i>=l;i--)
            {
                result.add(matrix[d][i]);
            }
            if(--d<u)  break;
            for(int i=d;i>=u;i--)
            {
                result.add(matrix[i][l]);
            }
            if(++l>r) break;
        }
        return result;
    }
}

#73、矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

示例 1:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

class Solution {
    //用第一行和第一列来代替两个标记数组,来记录其他行其他列是否有0
    //使用两个标记变量来记录第一行和第一列是否有0
    //不会破坏第一行和第一列的元素,因为如果其他行或者列有0
    //则会把对应的第一行或第一列变为0来记录,而且本就就是要变为0的
    //如果第一行或者第一列本身就是0的话,则也相当于记录。
    public void setZeroes(int[][] matrix) {
        int m=matrix.length;
        int n=matrix[0].length;
        boolean flagCol=false; //记录第一列是否含有0
        boolean flagRow=false;//记录第一列是否有含有0
        for(int i=0;i<m;i++)
        {
            if(matrix[i][0]==0)
                flagCol=true;
        }
        for(int j=0;j<n;j++)
        {
            if(matrix[0][j]==0)
                flagRow=true;
        }
        //遍历每个元素,打上标记
        for(int i=1;i<m;i++)
        {
            for(int j=1;j<n;j++)
            {
                if(matrix[i][j]==0)
                    matrix[i][0]=matrix[0][j]=0; //对应的标记
            }
        }
        //遍历每个元素,如果对应的标记为0,则赋值
        for(int i=1;i<m;i++)
        {
            for(int j=1;j<n;j++)
            {
                if(matrix[i][0]==0|| matrix[0][j]==0)
                    matrix[i][j]=0;
            }
        }
        if(flagCol)
        {
            for(int i=0;i<m;i++)
            {
                matrix[i][0]=0;
            }
        }
        if(flagRow)
        {
            for(int j=0;j<n;j++)
            matrix[0][j]=0;
        }


    }
}

#48、旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

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

class Solution {
    //使用翻转来达到旋转的效果
    public void rotate(int[][] matrix) {
        int n=matrix.length;
        //水平翻转
        for(int i=0;i<n/2;i++)
        {
            for(int j=0;j<n;j++)
            {
                int temp=matrix[i][j];
                matrix[i][j]=matrix[n-1-i][j];
                matrix[n-i-1][j]=temp;
            }
        }
        //主对角线翻转
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<i;j++)
            {
                int temp=matrix[i][j];
                matrix[i][j]=matrix[j][i];
                matrix[j][i]=temp;
            }
        }

    }
}

#240、搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例 1:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

Z字形查找:


class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m=matrix.length;
        int n=matrix[0].length;
        int x=0,y=n-1;  //从右上角开始
        while(x<m && y>=0)
        {
            if(matrix[x][y]==target)
                return true;
            //如果matrix[x][y]>target,说明第y列后面的都大于target
            if(matrix[x][y]>target) 
                y--;
                //如果matrix[x][y]<target,说明第x行前面的都小于target
            else{
                x++;
            }
        }
        return false;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值