LeetCode 热题 100打卡第十三天

LeeCode热题 100打卡第十三天

第一题:旋转图像(LeeCode第48题):

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。


解法一:(使用了一维数组,这个有点钻了空子,不太推荐,建议还是参考解法二的原地交换,但这是我最先想到的解法)

找到转换后的矩阵和原矩阵之间的关系,然后将转换后的矩阵按顺序存入一维数组,再用转换后的一维数组去覆盖原二维数组的值。

class Solution {
    public void rotate(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        for(int j = 0; j < matrix.length; j++){
            for(int i = matrix.length - 1 ; i >= 0; i--)
            list.add(matrix[i][j]);
        }
        int k = 0;
        for(int i = 0; i < matrix.length; i++){
            for(int j = 0; j < matrix.length; j++){
                matrix[i][j] = list.get(k++);
            }
        }
    }
}

解法二:(原地交换)

主要思想,找出转换后的矩阵如何由原矩阵获得。先将原矩阵按对角线进行翻转,再将矩阵左右进行翻转即可得到目标矩阵

class Solution {
    public void rotate(int[][] matrix) {
        int temp;
        for(int i = 0; i < matrix.length; i++){
            for(int j = i; j < matrix.length; j++){
                temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        for(int i = 0; i < matrix.length; i++){
            for(int k = 0; k < matrix.length/2; k++){
                temp = matrix[i][k];
                matrix[i][k] = matrix[i][matrix.length - k -1];
                matrix[i][matrix.length - k -1] = temp;
            }
        }
    }
}

第二题:搜索二维矩阵II(LeeCode第240题):

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。


主要思想:最核心的思想将这个矩阵看作一颗二叉搜索树,

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        int startx = 0,starty = 0, offset = 1, m = matrix.length, n = matrix[0].length;
        int loop = Math.min(m, n) / 2;
        int i, j;
        while(loop-- >0){
            for(j = starty; j < n - offset; j++){
                list.add(matrix[startx][j]);
            }
            for(i = startx; i < m - offset; i++){
                list.add(matrix[i][j]);
            }
            for(; j > starty; j--){
                list.add(matrix[i][j]);
            }
            for(; i > startx; i--){
                list.add(matrix[i][j]);
            }
            startx++;
            starty++;
            offset++;
        }
        if(Math.min(m, n) % 2 == 1){
            if(m < n){
                for(j = starty; j <= n - offset; j++) list.add(matrix[startx][j]);
            }else{
                for(i = startx; i <= m - offset; i++) list.add(matrix[i][starty]);
            }
        }
        return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值