矩陣算法題
- 1、矩陣置零
- 2、螺旋矩陣
- 3、旋轉圖像
- 4、搜索二維矩陣
1、矩陣置零
解題思路:這道題核心是要確定哪些行和哪些列要置零。所以定義兩個數組,一個記錄要置零的行,一個記錄要置零的列。遍歷整個矩陣,如果當前位置是0的話,就令l[i]=1,r[j]=1,之后再遍歷l數組和r數組,并且對原數組置零。
class Solution {public void setZeroes(int[][] matrix) {int m = matrix.length;int n = matrix[0].length;int []l = new int[m];int []r = new int[n];//找到要置零的行和列for(int i = 0;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j]==0){l[i]=1;r[j]=1;}}}//遍歷行,確定哪一行要置零for(int i = 0;i<m;i++){if(l[i]==1){for(int j =0;j<n;j++){matrix[i][j]=0;}}}//遍歷列,確定哪一列要置零for(int j = 0;j<n;j++){if(r[j]==1){for(int i =0;i<m;i++){matrix[i][j]=0;}}}}
}
2、螺旋矩陣
解題思路:這道題要確定上下左右的邊界值,依次遍歷整個矩陣。
class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> result = new ArrayList<>();int m = matrix.length;int n = matrix[0].length;int top = 0,bottom = m-1;int left = 0,right = n-1;while(top<=bottom&&left<=right){//加入上面的一行for(int j = left;j<=right;j++){result.add(matrix[top][j]);}top++;//加入左邊的一列for(int i = top;i<=bottom;i++){result.add(matrix[i][right]);}right--;//加入下面的一行if(top<=bottom){for(int j = right;j>=left;j--){result.add(matrix[bottom][j]);}bottom--;}//加入左邊的一列if(left<=right){for(int i = bottom;i>=top;i--){result.add(matrix[i][left]);}left++;}}return result;}
}
3、旋轉圖像
解題思路:先將一行存儲到一個數組中去,依次遍歷整個矩陣,左列最后兩個到上行的左邊兩個,下列的最后兩個到左列的最后兩個,右列的上面兩個到下列的右邊兩個,上列存儲的到右列的上面兩個。
class Solution {public void rotate(int[][] matrix) {int n = matrix.length;int left = 0;int right = n - 1;int top = 0;int bottom = n - 1;// 每一圈旋轉while (left < right && top < bottom) {int len = right - left;int[] tmp = new int[len]; // 保存當前層頂部行(不含最后一個元素)// 1. 保存 top 行的前 len 個元素(右上角那個位置留給最后賦值)for (int j = 0; j < len; j++) {tmp[j] = matrix[top][left + j];}// 2. 左列 → 上行for (int i = 0; i < len; i++) {matrix[top][left + i] = matrix[bottom - i][left];}// 3. 下行 → 左列for (int j = 0; j < len; j++) {matrix[bottom - j][left] = matrix[bottom][right - j];}// 4. 右列 → 下行for (int i = 0; i < len; i++) {matrix[bottom][right - i] = matrix[top + i][right];}// 5. tmp(原 top 行) → 右列for (int j = 0; j < len; j++) {matrix[top + j][right] = tmp[j];}// 收縮一圈left++;right--;top++;bottom--;}}
}
4、搜索二維矩陣
解題思路:從右上角開始判斷,如果target小于這個數,就往左移,如果target大于這個數就往下移。因為最右上角是這一行的最大值,也是這一列的最小值。
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length;int n = matrix[0].length;int top = 0;int right = n-1;while(top<m&&right>=0){if(target>matrix[top][right]){top++;}else if(target<matrix[top][right]){right--;}else{return true;}}return false;}
}