Leet专题刷题Day04-矩阵

Leet专题刷题Day04-矩阵

48. 旋转图像

思路一:原图像的从下往上第一列就等于旋转后的第一行。创建新的矩阵。

class Solution {
    public void rotate(int[][] matrix) {
        int row = matrix.length;
        int column = matrix[0].length;
        int[][] ans = new int[row][column];
        for (int i = 0; i < row; i++){
            for (int j = 0; j < column; j++){
                ans[i][j] = matrix[column - j -1][i];
            }
        }
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < column; ++j) {
                matrix[i][j] = ans[i][j];
            }
        }
    }
}

思路二:先以左上-右下对角条线为轴做翻转,再以中心的竖线为轴做翻转,就可以翻转90度。

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        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;
            }
        }

        for (int l = 0; l < n; l++){
            for (int i = 0,j = n-1; i < j; i++, j--){
                int temp = matrix[l][i];
                matrix[l][i] = matrix[l][j];
                matrix[l][j] = temp;
            }
        }

    }
}
189. 旋转数组

直接思路:(超时)向右旋转k次

class Solution {
    public void rotate(int[] nums, int k) {
        for (int i = 0; i < k; i++){
            travel(nums);
        }

    }
    void travel(int[] nums){
        int n = nums.length;
        int temp = nums[n-1];
        for (int i = n-1; i > 0; i--){
            nums[i] = nums[i-1];
        }
        nums[0] = temp;
    }
}

思路二:反转整个数组,在分别反转k前和k后。

class Solution {
    public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }
    public void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start += 1;
            end -= 1;
        }
    }
}
54. 螺旋矩阵
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        int left = 0;
        int right = matrix[0].length-1;
        int top = 0;
        int down = matrix.length - 1;
        while(left <= right && top<= down){
            for (int i = left; i <= right; i++){
                res.add(matrix[top][i]);
            }
            top++;
            for (int i = top; i <= down; i++){
                res.add(matrix[i][right]);
            }
            right--;
            for (int i = right; i >= left && top<=down ; i--){
                res.add(matrix[down][i]);
            }
            down--;
            for (int i = down; i >= top && left<=right; i--){
                res.add(matrix[i][left]);
            }
            left++;
        }


        return res;
    }
}
832. 翻转图像

思路 xor操作

class Solution {
    public int[][] flipAndInvertImage(int[][] A) {
        for(int num[]:A){
            int n = num.length;
            int low = 0;
            int high = n-1;
            while(low<=high){
                int temp = num[low];
                num[low++] = num[high]^1;
                num[high--] = temp^1;
            }
        }
        return A;
    }
}
566. 重塑矩阵
class Solution {
    public int[][] matrixReshape(int[][] mat, int r, int c) {
        int m = mat.length;
        int n = mat[0].length;
        if (m * n != r * c) {
            return mat;
        }

        int[][] res = new int[r][c];
        int row = 0;
        int column = 0;
        for (int i = 0; i < mat.length; i++){
            for (int j = 0; j < mat[0].length; j++){
                if (column == c){
                    row++;
                    column = 0;
                }
                res[row][column++] = mat[i][j];
            }
        }
        return res;
    }
}
剑指 Offer 04. 二维数组中的查找

从右上角开始走,利用这个顺序关系可以在O(m+n)的复杂度下解决这个题:

  • 如果当前位置元素比target小,则row++
  • 如果当前位置元素比target大,则col–
  • 如果相等,返回true
  • 如果越界了还没找到,说明不存在,返回false
class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if(matrix == null || matrix.length == 0) {
            return false;
        }
        int m = matrix.length, n = matrix[0].length;
        int row = 0, col = n - 1;
        while(row < m && col >= 0) {
            if(matrix[row][col] > target) {
                col--;
            }else if(matrix[row][col] < target) {
                row++;
            }else {
                return true;
            }
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
探险家小扣的行动轨迹,都将保存在记录仪中。expeditions[i] 表示小扣第 i 次探险记录,用一个字符串数组表示。其中的每个「营地」由大小写字母组成,通过子串 -> 连接。例:"Leet->code->Campsite",表示到访了 "Leet"、"code"、"Campsite" 三个营地。expeditions[0] 包含了初始小扣已知的所有营地;对于之后的第 i 次探险(即 expeditions[i] 且 i > 0),如果记录中包含了之前均没出现的营地,则表示小扣 新发现 的营地。 请你找出小扣发现新营地最多且索引最小的那次探险,并返回对应的记录索引。如果所有探险记录都没有发现新的营地,返回 -1。注意: 大小写不同的营地视为不同的营地; 营地的名称长度均大于 0。用python实现。给你几个例子:示例 1: 输入:expeditions = ["leet->code","leet->code->Campsite->Leet","leet->code->leet->courier"] 输出:1 解释: 初始已知的所有营地为 "leet" 和 "code" 第 1 次,到访了 "leet"、"code"、"Campsite"、"Leet",新发现营地 2 处:"Campsite"、"Leet" 第 2 次,到访了 "leet"、"code"、"courier",新发现营地 1 处:"courier" 第 1 次探险发现的新营地数量最多,因此返回 1。示例 2: 输入:expeditions = ["Alice->Dex","","Dex"] 输出:-1 解释: 初始已知的所有营地为 "Alice" 和 "Dex" 第 1 次,未到访任何营地; 第 2 次,到访了 "Dex",未新发现营地; 因为两次探险均未发现新的营地,返回 -1
04-23

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值