算法第四章矩阵你真的了解吗?(二)

简介: 算法第四章矩阵你真的了解吗?(二)

矩阵中一个为0XY全部为0.中进行数值累加。


package 第四章矩阵知识讲解;
import java.util.Random;
import java.util.Scanner;
/**
 * 
 * 生成包含0的二维数组,找出0所在的行列,
 * 反找行和列中没有0 的坐标,该坐标为中心,将行和列的值做累加
 *
 */
public class Demo4 {
  int nums[][]=null;
  //创建一个和原数组一模一样的临时的二维数组
  int[][] temp=null;
  private void init() {
  System.out.println("输入二维数组的阶数:");
  Scanner scanner=new Scanner(System.in);
  int n=scanner.nextInt();
  scanner.close();
  //初始化数组
  nums=new int[n][n];
  temp=new int[n][n];
  for (int i = 0; i < nums.length; i++) {
    for (int j = 0; j < nums[i].length; j++) {
    nums[i][j]=Math.random()>0.2?new Random().nextInt(5)+1:0;
    System.out.print(nums[i][j]+"\t");
    }
    System.out.println();
  }
  print();
  }
  private void print() {
  System.out.println("结果:");
  int[] row=new int[nums.length];
  int[] col=new int[nums[0].length];
  //循环遍历二维数组的每一个值,找出等于的横纵坐标
  for (int i = 0; i < nums.length; i++) {
    for (int j = 0; j < nums[i].length; j++) {
    //判断是否为0
    if (nums[i][j]==0) {
      //将横坐标,纵坐标在一维数组中的位置标记为1
      row[i]=1;
      col[j]=1;
    }
    }
  }
  for (int i = 0; i < nums.length; i++) {
    for (int j = 0; j < nums[i].length; j++) {
    //如果两个一维数组中,横坐标即没有被标记,纵坐标也没有被标记
    if (row[i]!=1&&col[j]!=1) {
      //说明该数字所在的行和列中都没有出现0
      //定义一个变量,作为累加和
      int sum=0;
      //累加行
      for (int k = 0; k < nums.length; k++) {
      sum+=nums[i][k];
      }
      //累加列
      for (int k = 0; k < nums.length; k++) {
      sum+=nums[k][j];
      }
      //因为行和列的累加,该值本身参与累加两次
      //减掉一次
      sum-=nums[i][j];
      temp[i][j]=sum;
    }
    }
  }
  //输出改变后的二维数组
  for (int i = 0; i < nums.length; i++) {
    for (int j = 0; j < nums[i].length; j++) {
    if (temp[i][j]>0) {
      nums[i][j]=temp[i][j];
    }
    System.out.print(nums[i][j]+"\t");
    }
    System.out.println();
  }
  }
  public static void main(String[] args) {
  new Demo4().init();
  }
}


給定一个二维数组,Z型打印。


package 第四章矩阵知识讲解;
import java.util.Scanner;
/**
 * 給定一个二维数组,Z型打印
 * 
 *
 */
public class Demo6 {
  int[][] nums=null;
  private void init() {
  System.out.println("输入二维数组的阶数:");
  Scanner scanner=new Scanner(System.in);
  int n=scanner.nextInt();
  scanner.close();
  nums=new int[n][n];
  int m=1;
  for (int i = 0; i < nums.length; i++) {
    for (int j = 0; j < nums[i].length; j++) {
    nums[i][j]=m++;
    System.out.print(nums[i][j]+"\t");
    }
    System.out.println();
  }
  print();
  }
  private void print() {
  //设置起点坐标和终点坐标
  int x1=0,y1=0;
  int x2=nums.length-1,y2=nums[0].length-1;
  boolean l2r=true;//从左往右
  while (x1<=x2&&y1<=y2) {
    //从左往右
    if (l2r) {
    System.out.println(nums[x1][y1]+"\t");
    if (x1==0&&y1<y2) {
      //在第一行,没有到最后一列,平移然后变向
      y1++;
      l2r=!l2r;
    }else if (y1==y2) {
      //到最后一列
      x1++;
      l2r=!l2r;
    }else {
      //上坡
      x1--;
      y1++;
    }
    }else {
    System.out.print(nums[x1][y1]+"\t");
    //从右往左
    if (y1==0&&x1<x2) {
      x1++;
      l2r=!l2r;
    }else if (x1==x2) {
      //到最后一行
      y1++;
      l2r=!l2r;
    }else {
      //下坡
      x1++;
      y1--;
    }
    }
  }
  }
  public static void main(String[] args) {
  new Demo6().init();
  }
}



给定一个二维数组,由1和0组成,从二维数组中找出以连续的1为边框的最大子二维数组的阶数


package 第四章矩阵知识讲解;
import java.util.Scanner;
/**
 * 
 * 给定一个二维数组,由1和0组成,从二维数组中找出以连续的1为边框的最大子二维数组的阶数
 *
 */
public class Demo7 {
  int[][] nums=null;
  private void init() {
  System.out.println("输入二维数组的阶数:");
  Scanner scanner=new Scanner(System.in);
  int z=scanner.nextInt();
  scanner.close();
  nums=new int[z][z];
  //20%的概率产生0
  for (int i = 0; i < nums.length; i++) {
    for (int j = 0; j < nums[i].length; j++) {
    nums[i][j]=Math.random()>0.2?1:0;
    System.out.print(nums[i][j]+"\t");
    }
    System.out.println();
  }
  int m=print();
  System.out.println("找到的最大阶数为:"+m);
  }
  private int print() {
  //设置该二维数组的最大阶数范围
  int N=nums.length;
  //定义一个变量,用于控制当前查找的阶数
  int n=N;
  //循环扫描每一层的阶数
  while (n>0) {
    for (int i = 0; i < nums.length; i++) {
      if (i+n>N) break;
    abc:for (int j = 0; j < nums.length; j++) {
      if (j+n>N) break;
      //设定移动点
      int x=i,y=j;
      //第一行向右移动
      while (y<j+n) {
      if (nums[x][y++]==0) continue abc;
      }
      y--;
      //最后一列往下移动
      while (x<i+n) {
      if (nums[x++][y]==0) continue abc;
      }
      x--;
      //最后一行向左走
      while (y>=j) {
      if (nums[x][y--]==0) continue abc;
      }
      y++;
      //第一列往上走
      while (x>i) {
      if (nums[x--][y]==0) continue abc;
      }
      //如果四条边都没有发现0
      return n;
    }
    }
    n--;
  }
  return 0;
  }
  public static void main(String[] args) {
  new Demo7().init();
  }
}


随机产生一维数组,可能包含正数和负数,求连续的最大累加和。


package 第四章矩阵知识讲解;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
/**
 * 
 * 随机产生一维数组,可能包含正数和负数,求连续的最大累加和
 *
 */
public class Demo8 {
  int[] nums=null;
  private void init() {
  System.out.println("输入一维数组的长度:");
  Scanner scanner=new Scanner(System.in);
  int n=scanner.nextInt();
  scanner.close();
  nums=new int[n];
  for (int i = 0; i < nums.length; i++) {
    int x=Math.random()>0.5?-1:1;
    nums[i]=new Random().nextInt(10)*x;
  }
  System.out.println(Arrays.toString(nums));
  print();
  }
  private void print() {
  //定义一个变量,用于保存最后的结果
  int result=nums[0];
  for (int i = 0; i < nums.length; i++) {
    //定义一个变量,用于存储每一轮最后的结果
    int r_sum=nums[i];
    //定义一个变量,用于存储每一轮中的每一次累加和
    int sum=nums[i];
    for (int j = i+1; j < nums.length; j++) {
    sum+=nums[j];
    if (sum>r_sum) {
      r_sum=sum;
    }
    }
    //内层循环结束后,r_sum得到的结果就是第一轮中的最大累加和
    if (r_sum>result) {
    result=r_sum;
    }
  }
  System.out.println("最大累加和为:"+result);
  }
  public static void main(String[] args) {
  new Demo8().init();
  }
}
package 第四章矩阵知识讲解;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class T9 {
int[] nums=null;
  private void init() {
  System.out.println("输入一维数组的长度:");
  Scanner scanner=new Scanner(System.in);
  int n=scanner.nextInt();
  scanner.close();
  nums=new int[n];
  for (int i = 0; i < nums.length; i++) {
    int x=Math.random()>0.5?-1:1;
    nums[i]=new Random().nextInt(10)*x;
  }
  System.out.println(Arrays.toString(nums));
  print();
  }
  private void print() {
  //定义最后的累加和的结果
  int result=nums[0];
  //定义临时的累加和的变量
  int sum=nums[0];
  //定义左右下标
  int left=0,right=0;
  for (int i = 1; i < nums.length; i++) {
    //每一次循环,都判断一下这个临时的变量的值是否小于0
    if (sum>=0) {
    //说明加的这个值是正数,是需要的
    sum+=nums[i];
    }else {
    //如果是负数,说明刚加的这个数不能要
    sum=nums[i];
    left=i;
    }
    //当sum加完一个数值之后,是否比最终的值要大,说明刚刚加的那个数值是有用
    if (sum>=result) {
    result=sum;
    right=i;
    }
  }
  System.out.println("起点下标为:"+left+"--终点的下标为:"+right+"---最大累加和:"+result);
  }
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  new T9().init();
  }
}


转方阵;


package 第四次蓝桥杯测试;
import java.util.Arrays;
import java.util.Scanner;
/**
 * 转方阵
 * @author MZFAITHDREAM
 *对一个方阵转置,就是把原来的行号变列号,原来的列号变行号
例如,如下的方阵:
1  2  3  4
5  6  7  8
9 10 11 12
13 14 15 16
转置后变为:
1  5  9 13
2  6 10 14
3  7 11 15
4  8 12 16
但,如果是对该方阵顺时针旋转(不是转置),却是如下结果:
13  9  5  1
14 10  6  2
15 11  7  3
16 12  8  4
你要实现的功能就是要把一个方阵顺时针旋转。
 */
public class DemoTest10 {
  int[][]nums=null;
  private void init() {
  System.out.println("输入二位数组的阶数");
  Scanner scanner=new Scanner(System.in);
  int n=scanner.nextInt();
  scanner.close();
  nums=new int[n][n];
  int num=0;
  for (int i = 0; i < nums.length; i++) {
    for (int j = 0; j < nums[i].length; j++) {
    nums[i][j]=++num;
    System.out.print(nums[i][j]+"\t");
    }
    System.out.println();
  }
  }
  public static void main(String[] args) {
  new DemoTest10().init();
  }
/**
 * 生成二维数组的方式
 */
}


相关文章
|
9月前
|
算法 测试技术 C++
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
|
9月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
79 0
|
9月前
|
算法 测试技术 C#
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
|
2月前
|
算法
|
4月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
4月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
68 4
|
4月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
250 0
|
6月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
79 6
|
9月前
|
算法 测试技术 编译器
【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
题目描述 题目 在字符矩阵中查找给定字符串的所有匹配项 给定一个M×N字符矩阵,以及一个字符串S,找到在矩阵中所有可能的连续字符组成的S的次数。所谓的连续字符,是指一个字符可以和位于其上下左右,左上左下,右上右下8个方向的字符组成字符串。用回溯法求解。
136 1
|
8月前
|
机器学习/深度学习 数据采集 人工智能
算法金 | 协方差、方差、标准差、协方差矩阵
**摘要:** 本文介绍了统计学中的基础概念,包括方差、标准差、协方差及其矩阵。方差衡量数据的分散程度,标准差是方差的平方根,提供相同单位下的波动度量。协方差则分析两个变量的关联性,正负值表示正负相关。协方差矩阵扩展到多变量情况,展示多个变量间的关系。这些工具在金融、质量控制、机器学习等领域有广泛应用。文章通过实例和公式清晰解释了每个概念,并强调理解它们之间的关系对于数据分析和统计建模的重要性。
97 0
算法金 | 协方差、方差、标准差、协方差矩阵

热门文章

最新文章