前言:
五月集训,前面为学习内容,想要一起学习的可以看一看,最后的才是五月集训每天的作业。
一、知识点
二维数组问题。
二、课堂习题
这里的题均出自《算法零基础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;
}
}
四、总结
对于算法的掌握还是不够熟练,需要进行反复训练!
另外,剩下的课堂训练题目留到下个月的集训啦(●ˇ∀ˇ●)