《五月集训》(第11天)矩阵

前言:

五月集训,前面为学习内容,想要一起学习的可以看一看,最后的才是五月集训每天的作业。

一、知识点

二维数组问题。

二、课堂习题

这里的题均出自《算法零基础100讲》
着急想要学习的同学,去看专栏哦🤭

三、作业

1351. 统计有序矩阵中的负数
1672. 最富有客户的资产总量
832. 翻转图像
1329. 将矩阵按对角线排序
解题思路:
1.由于题目给的数组都是递减的有序数列,所以我们可以运用二分查找的思想,对每一行的数列二分查找第一个负数,长度减去第一个负数下标即为这一行的负数数量,每行累加即可;
2.对于每一个客户(每一行)的资产求和,比较得到最大值即可;
3.按照提议先水平翻转再反转即可,值得一提的是:反转时我们可以运用之前学的位运算中异或‘^’的特性;
4.先按行将每个对角线中的数组拿出,排好序(这里我直接用了优先队列),然后再依次放回去,按列重复这个过程。
代码:

class Solution {
    public int countNegatives(int[][] grid) {
        int ans = 0;
        for(int i = 0;i < grid.length;i++){
            int l = 0,r = grid[i].length-1;
            int res = -1;
            while(l <= r){
                int mid = (l+r)>>1;
                if(grid[i][mid] < 0){
                    res = mid;
                    r = mid - 1;
                }else{
                    l = mid + 1;
                }
            }
            if(res == -1){
                continue;
            }
            ans += grid[i].length - res;
        }
        return ans;
    }
}
class Solution {
    public int maximumWealth(int[][] accounts) {
        int max = 0;
        for(int[] account : accounts){
            int sum = 0;
            for(int x : account){
                sum += x;
            }
            max = Math.max(max, sum);
        }
        return max;
    }
}
class Solution {
    public int[][] flipAndInvertImage(int[][] image) {
        int m = image.length;
        int n = image[0].length;
        for(int i = 0;i < m;i++){
            int pos = n-1;
            for(int j = 0;j < n/2;j++){
                int temp = image[i][j];
                image[i][j] = image[i][pos];
                image[i][pos] = temp;
                pos--;
            }
        }
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                image[i][j]= image[i][j]^1;
            }
        }
        return image;
    }
}
class Solution {
    public int[][] diagonalSort(int[][] mat) {
        int m = mat.length;
        int n = mat[0].length;
        int p = 1;
        int q = 0;
        PriorityQueue<Integer> link = new PriorityQueue<>();
        while(p < m){
            for(int i = p,j = 0;i < m&& j < n;i++,j++){
                link.offer(mat[i][j]);
            }
            for(int i = p,j = 0;i < m&& j < n;i++,j++){
                mat[i][j] = link.poll();
            }
            p++;
        }
        while(q < n){
            for(int i = 0,j = q;i < m && j < n;i++,j++){
                link.offer(mat[i][j]);
            }
            for(int i = 0,j = q;i < m && j < n;i++,j++){
                mat[i][j] = link.poll();
            }
            q++;
        }
        return mat;
    }
}

四、总结

对于算法的掌握还是不够熟练,需要进行反复训练!
另外,剩下的课堂训练题目留到下个月的集训啦(●ˇ∀ˇ●)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值