• Java-数据结构-矩阵专题


    一. 矩阵简单介绍

            矩阵其实就是一个二维的表格,那么数据结构中的矩阵其实也是一样的,计算机中可以用矩阵这种形式来存储数据。使用二维数组可来存储矩阵。

    二. leetcode实战

    1. leetcode48 旋转图像

            给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

    你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

     输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
    输出:[[7,4,1],[8,5,2],[9,6,3]]

    1. class Solution {
    2. public void rotate(int[][] matrix) {
    3. int n = matrix.length;
    4. for(int i = 0; i < n; i++){
    5. for(int j = 0; j < i; j++){
    6. int temp = matrix[i][j];
    7. matrix[i][j] = matrix[j][i];
    8. matrix[j][i] = temp;
    9. }
    10. }
    11. for(int i = 0; i < n; i++){
    12. for(int j = 0, k = n-1; j < n/2; j++,k--){
    13. int temp = matrix[i][j];
    14. matrix[i][j] = matrix[i][k];
    15. matrix[i][k] = temp;
    16. }
    17. }
    18. }
    19. }

    2. leetcode54 螺旋矩阵

    给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

    输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
    输出:[1,2,3,6,9,8,7,4,5]

    1. class Solution {
    2. public List spiralOrder(int[][] matrix) {
    3. List list = new ArrayList<>();
    4. int i1 = 0;
    5. int j1 = 0;
    6. int i2 = matrix.length-1;
    7. int j2 = matrix[0].length-1;
    8. while(i1 <= i2 && j1 <= j2){
    9. if(i1 == i2){
    10. while(j1 <= j2) list.add(matrix[i1][j1++]);
    11. }
    12. if(j1 == j2){
    13. while(i1 <= i2) list.add(matrix[i1++][j1]);
    14. }
    15. //水平向右
    16. for(int j = j1; j < j2; j++){
    17. list.add(matrix[i1][j]);
    18. }
    19. //垂直向下
    20. for(int i = i1; i < i2; i++){
    21. list.add(matrix[i][j2]);
    22. }
    23. //水平向右
    24. for(int j = j2; j > j1; j--){
    25. list.add(matrix[i2][j]);
    26. }
    27. //垂直向上
    28. for(int i = i2; i > i1; i--){
    29. list.add(matrix[i][j1]);
    30. }
    31. i1++;
    32. i2--;
    33. j1++;
    34. j2--;
    35. }
    36. return list;
    37. }
    38. }

    3. leetcode59 螺旋矩阵 II

    给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

    输入:n = 3
    输出:[[1,2,3],[8,9,4],[7,6,5]]

    1. class Solution {
    2. public int[][] generateMatrix(int n) {
    3. int[][] matrix = new int[n][n];
    4. int i1 = 0;
    5. int j1 = 0;
    6. int i2 = n-1;
    7. int j2 = n-1;
    8. int cur = 1;
    9. while(i1<=i2&&j1<=j2){
    10. //处理只剩一行的情况
    11. if(i1==i2){
    12. while(j1<=j2){
    13. matrix[i1][j1++] = cur++;
    14. }
    15. }
    16. //处理只剩一列的情况
    17. if(j1==j2){
    18. while(i1<=i2){
    19. matrix[i1++][j1] = cur++;
    20. }
    21. }
    22. //从左向右遍历
    23. for(int j=j1;j
    24. matrix[i1][j] = cur;
    25. cur++;
    26. }
    27. //从上向下遍历
    28. for(int i=i1;i
    29. matrix[i][j2] = cur;
    30. cur++;
    31. }
    32. //从右向左遍历
    33. for(int j=j2;j>j1;j--){
    34. matrix[i2][j] = cur;
    35. cur++;
    36. }
    37. //从下向上遍历
    38. for(int i=i2;i>i1;i--){
    39. matrix[i][j1] = cur;
    40. cur++;
    41. }
    42. //缩小圈的边界
    43. i1++;
    44. j1++;
    45. i2--;
    46. j2--;
    47. }
    48. return matrix;
    49. }
    50. }

    4. leetcode74 搜索二维矩阵


    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

    每行中的整数从左到右按升序排列。
    每行的第一个整数大于前一行的最后一个整数。

     输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
    输出:true
     

    1. class Solution {
    2. public boolean searchMatrix(int[][] matrix, int target) {
    3. int start = 0;
    4. int end = matrix.length-1;
    5. while(start < end){
    6. int mid = (start + end +1)>>1;
    7. if(matrix[mid][0] <= target){
    8. start = mid;
    9. }
    10. else {
    11. end = mid-1;
    12. }
    13. }
    14. if(matrix[start][0] == target){
    15. return true;
    16. }
    17. int temp = start;
    18. start = 0;
    19. end = matrix[0].length-1;
    20. while(start <= end){
    21. int mid = (start + end)>>1;
    22. if(matrix[temp][mid] > target){
    23. end = mid - 1;
    24. }
    25. else if(matrix[temp][mid] < target){
    26. start = mid+1;
    27. }
    28. else{
    29. return true;
    30. }
    31. }
    32. return false;
    33. }
    34. }

    5. leetcode498 对角线遍历

    给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。

    输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
    输出:[1,2,4,7,5,3,6,8,9]

    1. class Solution {
    2. public int[] findDiagonalOrder(int[][] mat) {
    3. int col = mat.length;
    4. int row = mat[0].length;
    5. int[] arr = new int[col*row];
    6. int cur = 0;
    7. int i = 0;
    8. int j = 0;
    9. boolean flag = true;
    10. while(cur < col * row){
    11. if(flag){
    12. while(i >= 0 && i < col && j >= 0 && j < row){
    13. arr[cur++] = mat[i][j];
    14. j++;
    15. i--;
    16. }
    17. }
    18. if(!flag){
    19. while(i >= 0 && i < col && j >= 0 && j < row){
    20. arr[cur++] = mat[i][j];
    21. i++;
    22. j--;
    23. }
    24. }
    25. if(i < 0){
    26. if(j >= 0 && j
    27. i++;
    28. flag = false;
    29. }
    30. else{
    31. i += 2;
    32. j -= 1;
    33. flag = false;
    34. }
    35. }
    36. if(j < 0) {
    37. if (i >= 0 && i < col) {
    38. j++;
    39. flag = true;
    40. } else {
    41. i--;
    42. j += 2;
    43. flag = true;
    44. }
    45. }
    46. if(i >= 0 && j == row){
    47. j--;
    48. i +=2;
    49. flag = false;
    50. }
    51. if(j >= 0 && i == col){
    52. i--;
    53. j +=2;
    54. flag = true;
    55. }
    56. }
    57. return arr;
    58. }
    59. }

  • 相关阅读:
    进程与线程
    Eureka的设计理念
    【校招VIP】java开源框架之spark
    Mybatis - 一对多/多对一映射
    LeetCode:有序数组的平方
    做个清醒的程序员之破解内卷漩涡
    R语言survminer包的ggsurvplot函数可视化生存曲线、legend.title指定图例的标题、legend.labs指定图例标签文本
    Sql语句大全--更新
    Golang并发编程——goroutine、channel、sync
    Linux locate命令报错:-bash: locate: command not found
  • 原文地址:https://blog.csdn.net/weixin_45532984/article/details/126104307