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;
}
}