73.矩阵置零
思考:对于行和列分别用两个标记数组,遍历数组如果发现对应行列有0,则标记为true,再遍历一次将标记为true的行列元素全部置为0
记录:需要二刷
class Solution {
public void setZeroes(int[][] matrix) {
boolean[] row = new boolean[matrix.length];
boolean[] col = new boolean[matrix[0].length];
for(int i = 0;i < matrix.length;i++){
for(int j = 0;j < matrix[0].length;j++){
if(matrix[i][j] == 0){
row[i] = true;
col[j] = true;
}
}
}
for(int i = 0;i < matrix.length;i++){
for(int j = 0;j < matrix[0].length;j++){
if(row[i] || col[j]){
matrix[i][j] = 0;
}
}
}
}
}
54.螺旋矩阵
思考:四个角就是四个边界值,框住,依次遍历
记录:需要二刷
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int left = 0,right = matrix[0].length-1;
int upper = 0,lower = matrix.length-1;
List<Integer> res = new ArrayList<>();
while(res.size() < matrix.length * matrix[0].length){
if(upper <= lower){
for(int i = left;i <= right;i++){
res.add(matrix[upper][i]);
}
upper++;
}
if(left <= right){
for(int i = upper;i <= lower;i++){
res.add(matrix[i][right]);
}
right--;
}
if(upper <= lower){
for(int i = right;i >= left;i--){
res.add(matrix[lower][i]);
}
lower--;
}
if(left <= right){
for(int i = lower;i >= upper;i--){
res.add(matrix[i][left]);
}
left++;
}
}
return res;
}
}
48.旋转图像
思考:旋转90度,相当于先按对角线翻转,再依次行翻转,记住规律就行
记录:需要二刷
class Solution {
public void rotate(int[][] matrix) {
for(int i = 0;i < matrix.length;i++){
for(int j = i;j < matrix[0].length;j++){
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
for(int[] num : matrix){
reverse(num);
}
}
void reverse(int[] num){
int left = 0,right = num.length-1;
while(left < right){
int temp = num[left];
num[left] = num[right];
num[right] = temp;
left++;
right--;
}
}
}
240.搜索二维矩阵||
思考:跟二分查找的思路一样,要找到增加、减少的条件,二维把初始定位在右上角,这样向下就是增大,向左就是减少,就可以用二分查找了
记录:不需要二刷
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int row = 0,col = matrix[0].length-1;
while(row <= matrix.length-1 && col >= 0){
if(matrix[row][col] < target){
row++;
}else if(matrix[row][col] > target){
col--;
}else{
return true;
}
}
return false;
}
}