矩阵简单问题(Java)

 问题: 顺时针打印二维方阵:
 1 2 3 4 15
 5 6 7 8 14
 9 10 11 12 13
 13 14 15 16

public class Test1 {
    public static void main(String[] args) {
        int[][] arr = new int[][]{
                {1, 2, 3, 4,100},
                {5, 6, 7, 8,101},
                {9, 10, 11, 12,102},
                {13, 14, 15, 16,103}
        };
        f1(arr);
    }
    static void f1(int[][] arr) {
        int leftRow = 0, leftCol = 0; //左上
        int rightRow = arr.length - 1, rightCol = arr[0].length - 1; //右下
        while (leftRow <= rightRow && leftCol <= rightCol) {
            for (int i = leftCol; i <= rightCol; i++) {
                System.out.print(arr[leftRow][i] + " ");
            }
            for (int i = leftRow + 1; i <= rightRow; i++) {
                System.out.print(arr[i][rightCol] + " ");
            }
            for (int i = rightCol - 1; i >= leftCol; i--) {
                System.out.print(arr[rightRow][i] + " ");
            }
            for (int i = rightRow - 1; i > leftRow; i--) {
                System.out.print(arr[i][leftCol] + " ");
            }
            leftRow++;
            leftCol++;
            rightRow--;
            rightCol--;
        }
    }
}

 问题:0所在的行和列清零
 1 2 3 4
 6 0 7 8
 9 10 0 11

只能先遍历一遍记录下0的位置,然后在改0

public class Test1 {
    public static void main(String[] args) {
        int[][] arr = new int[][]{
                {1, 2, 3, 4,100},
                {5, 6, 0, 8,101},
                {9, 10, 11, 0,102},
                {13, 14, 15, 16,103}
        };
        f2(arr);
        for (int[] ints : arr) {
            for (int i : ints) {
                System.out.print(i+" ");
            }
            System.out.println("");
        }
    }
    static void f2(int[][] arr){
        int m = arr.length,n = arr[0].length;
        int[] row = new int[m];
        int[] col = new int[n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(arr[i][j] == 0){
                    row[i]=1;
                    col[j]=1;
                }
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(row[i]==1 || col[j]==1){
                    arr[i][j]=0;
                }
            }
        }
    }
}

 问题:“Z”型打印
1,2, 3, 4
5,6, 7, 8
9,10,11,12 结果为1 2 5 9 6 3 4 7 10 11 8 12

public class Test1 {
    public static void main(String[] args) {
        int[][] arr = new int[][]{
                {1,2, 3, 4},
                {5,6, 7, 8},
                {9,10,11,12}
        };
        f3(arr);
    }
    static void f3(int[][] arr){
        int row = 0,m = arr.length;
        int col = 0,n = arr[0].length;
        boolean flag = true;  //控制是斜向上打印还是斜向下打印
        while(row<m && col<n){
            if(flag){
                System.out.print(arr[row][col]+" ");
                if(row==0 && col <n-1){ //斜上打印,碰到上端,就打印右边的,然后在斜向下
                    col++;
                    flag=false;
                } else if (row>0 && col== n-1) {//斜上打印,碰到右端,就打印下边的,然后在斜向下
                    row++;
                    flag=false;
                }else {
                    row--;
                    col++;
                }
            }else {
                System.out.print(arr[row][col]+" ");
                if(col==0 && row < m-1){ //斜下打印,碰到左端,就打印下边的,然后在斜向上
                    row++;
                    flag=true;
                } else if (col > 0 && row == m - 1) {//斜下打印,碰到下端,就打印右边的,然后在斜向上
                    col++;
                    flag=true;
                }else {
                    row++;
                    col--;
                }
            }
        }
    }
}

给定一个n*n矩阵,值只有0和1 返回边框为1的最大正方形的边长长度
0,1,1,1,1
0,1,0,0,1
0,1,0,0,1
0,1,1,1,1
0,1,0,1,1 返回4

public class Test1 {
    public static void main(String[] args) {
        int[][] arr = new int[][]{
                {0,1,1,1,1},
                {0,1,0,0,1},
                {0,1,0,0,1},
                {0,1,1,1,1},
                {0,1,0,1,1}
        };
        System.out.println(f4(arr));
    }
    static int f4(int[][] arr){
        int n = arr.length;
        helper(arr);
        while(n>=1){
            for(int i=0;i<arr.length;i++){
                for(int j=0;j<arr.length;j++){
                    if(i+n>arr.length || j+n>arr.length){
                        continue;
                    }
                    /*if(test(arr,i,j,n)){
                        return n;
                    }*/

                    if(help[i][j][0]>=n && help[i][j][1]>=n && help[i][j+n-1][1]>=n && help[i+n-1][j][0]>=n)
                        return n;
                }
            }
            n--;
        }
        return 0;
    }
    static int[][][] help;  // 0为右边1的个数,1为下面1的个数
    //构建三维数组,维护每一元素1的个数
    static void helper(int[][] arr){
        int n=arr.length;
        help=new int[n][n][2];
        int row= n-1;
        //先填充好最下面的一行
        for(int j=n-1;j>=0;j--){
            int value = arr[row][j];
            if(value==1){
                if(j==n-1)help[row][j][0]=1;
                else help[row][j][0]=help[row][j+1][0]+1;

                help[row][j][1]=1;
            }
        }
        row--;
        //在逐渐向上遍历
        for (int i=row;i>=0;i--){
            for(int j=n-1;j>=0;j--){
                int value = arr[i][j];
                if(value==1){
                    if(j==n-1)help[i][j][0]=1;
                    else help[i][j][0]=help[i][j+1][0]+1;

                    help[i][j][1]=help[i+1][j][1]+1;
                }
            }
        }
    }
}

问题:求最大子矩阵累加和,其值有正、有负、有0,返回子矩阵的最大累加和
解法:将矩阵中每行的相同列的元素逐渐相加,转化为 无序的一维数组求最大连续累加和。

那么我们先求一个一维无序数组arr,返回arr中子数组(连续)的最大累加和。

public class Test2 {
    public static void main(String[] args) {
        
    }
    static int f1(int[] arr){
        if(arr.length==0) return 0;
        int sum=arr[0],max=arr[0];
        int left = 0, right = 0;
        for(int i=1;i<arr.length;i++){
            if(sum<=0){
                sum=arr[i];
                left=i;
                //这里不能用continue,因为不能保证最大累加和大于0,可能每个元素都小于0.
            }else sum+=arr[i];

            if(sum>max){
                max=sum;
                right=i;
            }
        }
        System.out.println("left="+left+" ,right="+right);
        return max;
    }
}

然后按列求和,维护一个sum数组,sum[i]为第i列的元素求和,先是从第0行到最后一行的所有列求和,每加一次,求一次sum数组的最大子序列。然后在清空sum,然后在是第1行到最后一行的所有列求和,每次求和,求一次sum数组的最大子序列,然后在从第2行开启,直到遍历完所有行。

public class Test2 {
    public static void main(String[] args) {
        int[][] arr = new int[][]{
                {-90,48,78},
                {64,-40, 64},
                {-81,-7,66}
        };
        System.out.println(f2(arr));
    }
    static int f1(int[] arr){
        if(arr.length==0) return 0;
        int sum=arr[0],max=arr[0];
        int left = 0, right = 0;
        for(int i=1;i<arr.length;i++){
            if(sum<=0){
                sum=arr[i];
                left=i;
                //这里不能用continue,因为不能保证最大累加和大于0,可能每个元素都小于0.
            }else sum+=arr[i];

            if(sum>max){
                max=sum;
                right=i;
            }
        }
        System.out.println("left="+left+" ,right="+right);
        return max;
    }
     
    static int f2(int[][] arr){
        int row = 0; //从第一行作为起始行
        int m = arr.length;
        int n = arr[0].length;
        //按列求和
        int[] sums = new int[m];
        int max=0; //历史子矩阵累加和
        while(row<m){
            for(int i=row;i<m;i++){
                for(int j=0;j<n;j++){
                    sums[j]+=arr[j][i];
                }
                //累加完成
                //求无序一维数组的最大连续累加和
                int t = f1(sums);
                max=Math.max(max,t);
            }
            //以下一行作为起始行,
            Arrays.fill(sums,0);
            row++;
        }
        return max;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/947295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python】unittest单元测试

文章目录 基本使用不同启动方式的区别 基本使用 下面是根据文档写的一个demo&#xff0c;主要的内容基本都包含了&#xff0c;使用时导入自己的业务类测试类中的方法就行。 import unittest# 测试类不强制test开头&#xff0c;仅作为规范。但必须继承unittest.TestCase class…

基于SpringBoot的野生动物保护发展平台的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…

Linux一些问题

修改YUM源 Centos7将yum源更换为国内源保姆级教程_centos使用中科大源-CSDN博客 直接安装包&#xff0c;走链接也行 Index of /7.9.2009/os/x86_64/Packages 直接复制里面的安装包链接&#xff0c;在命令行直接 yum install https://vault.centos.org/7.9.2009/os/x86_64/Pa…

ELK 使用教程采集系统日志 Elasticsearch、Logstash、Kibana

前言 你知道对于一个系统的上线考察&#xff0c;必备的几样东西是什么吗&#xff1f;其实这也是面试中考察求职者&#xff0c;是否真的做过系统开发和上线的必备问题。包括&#xff1a;服务治理(熔断/限流) (opens new window)、监控 (opens new window)和日志&#xff0c;如果…

04-spring-理-ApplicationContext的实现

实现1&#xff1a;ClassPathXmlApplicationContext 1、内部维护了 DefaultListableBeanFactory 2、通过XmlBeanDefinitionReader 读取配置文件将结果加入到 DefaultListableBeanFactory 3、没有维护 bean后置处理器 &#xff0c;可以通过在xml配置 <context:annotation-c…

【linux板卡】lubancat通过vnc远程访问桌面

鲁班猫开发板通过远程VNC连接桌面&#xff1a; 硬件&#xff1a;lubancat2&#xff0c;网线 软件&#xff1a;ssh软件&#xff0c;vnc viewer 参考链接&#xff1a;https://training.eeworld.com.cn/video/38821 1、ssh连接lubancat2 &#xff0c;输入ifconfig查看ip 2、输入 …

HarmonyOS Next ArkUI @State @Prop @Link @Provide @Consume笔记

学习目标&#xff1a; State装饰器 Prop装饰器 Link装饰器 Link装饰器 Provide装饰器 Consume装饰器 学习内容&#xff1a; GrandsonComponent Component export struct GrandsonComponent {Consume(provideValue) consumeValue: numberbuild() {Column(){Text(孙组件).font…

【GPT】Coze使用开放平台接口-【8】创建应用

coze 可以用来创建简单的应用啦&#xff0c;这样测试起来会比原本的 Agent 更加方便&#xff0c;我们来看看如何创建一个“语音Real不Real”的应用。这个应用就是来检测语音是否是伪造的&#xff0c;克隆或者是合成的。先看下原本 Agent 的样子&#xff1a; 深度伪造语音检测&a…

选择器(结构伪类选择器,伪元素选择器),PxCook软件,盒子模型

结构为类选择器 伪元素选择器 PxCook 盒子模型 (内外边距&#xff0c;边框&#xff09; 内外边距合并&#xff0c;塌陷问题 元素溢出 圆角 阴影: 模糊半径&#xff1a;越大越模糊&#xff0c;也就是越柔和 案例一&#xff1a;产品卡片 <!DOCTYPE html> <html lang&q…

[极客大挑战 2019]Knife1

这里很显然&#xff0c;根据提示可以猜测&#xff0c;已经有一句话木马上传了&#xff0c;但是路径这里不是很清楚&#xff0c;不知道路径在哪里&#xff0c;不过还是用菜刀连一下试试&#xff1a; 连接成功&#xff0c;在根目录下发现flag。不过如果不用菜刀&#xff0c;可以用…

面试手撕笔记ML/DL

数据集 数据集的批处理迭代器 Deep-ML | Batch Iterator for Dataset 实现一个批量可迭代函数&#xff0c;该函数在numpy数组X和可选numpy数组y中进行采样。该函数应该生成指定大小的批量。如果提供了y&#xff0c;则该函数应生成&#xff08;X, y&#xff09;对的批次&#…

flink cdc oceanbase(binlog模式)

接上文&#xff1a;一文说清flink从编码到部署上线 环境&#xff1a;①操作系统&#xff1a;阿里龙蜥 7.9&#xff08;平替CentOS7.9&#xff09;&#xff1b;②CPU&#xff1a;x86&#xff1b;③用户&#xff1a;root。 预研初衷&#xff1a;现在很多项目有国产化的要求&#…

JavaWeb开发(五)Servlet-ServletContext

1. ServletContext 1.1. ServletContext简介 1.1.1. ServletContext定义 ServletContext即Servlet上下文对象&#xff0c;该对象表示当前的web应用环境信息。 1.1.2. 获取ServletContext对象: &#xff08;1&#xff09;通过ServletConfig的getServletContext()方法可以得到…

ubuntu 如何使用vrf

在Ubuntu或其他Linux系统中&#xff0c;您使用ip命令和sysctl命令配置的网络和内核参数通常是临时的&#xff0c;这意味着在系统重启后这些配置会丢失。为了将这些配置持久化&#xff0c;您需要采取一些额外的步骤。 对于ip命令配置的网络接口和路由&#xff0c;您可以将这些配…

2024秋语法分析作业-B(满分25分)

特别注意&#xff1a;第17条产生式改为 17) Stmt → while ( Cond ) Stmt 【问题描述】 本次作业只测试一个含简单变量声明、赋值语句、输出语句、if语句和while语句的文法&#xff1a; 0) CompUnit → Block 1) Block → { BlockItemList } 2) BlockItemList → BlockItem…

SQL-leetcode-197. 上升的温度

197. 上升的温度 表&#xff1a; Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是该表具有唯一值的列。 没有具有相同 recordDate 的不同行。 该表包…

C#编写的金鱼趣味小应用 - 开源研究系列文章

今天逛网&#xff0c;在GitHub中文网上发现一个源码&#xff0c;里面有这个金鱼小应用&#xff0c;于是就下载下来&#xff0c;根据自己的C#架构模板进行了更改&#xff0c;最终形成了这个例子。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b; 1) 初始化&#xff1b; 将样…

通过无障碍服务(AccessibilityService)实现Android设备全局水印显示

一、无障碍功能简介 首先我们先来了解下无障碍功能的官方介绍&#xff1a; 无障碍服务仅应用于帮助残障用户使用 Android 设备和应用。它们在后台运行&#xff0c;并在触发 AccessibilityEvents 时接收系统的回调。此类事件表示用户界面中的某些状态转换&#xff0c;例如焦点已…

【Blackbox Exporter】prober.Handler源码详细分析

http.HandleFunc(path.Join(*routePrefix, "/probe"), func(w http.ResponseWriter, r *http.Request) {sc.Lock()conf : sc.Csc.Unlock()prober.Handler(w, r, conf, logger, rh, *timeoutOffset, nil, moduleUnknownCounter, allowedLevel)})我们了解到blackbox_ex…

SpringMVC核心、两种视图解析方法、过滤器拦截器 “ / “ 的意义

SpringMVC的执行流程 1. Spring MVC 的视图解析机制 Spring MVC 的核心职责之一是将数据绑定到视图并呈现给用户。它通过 视图解析器&#xff08;View Resolver&#xff09; 来将逻辑视图名称解析为具体的视图文件&#xff08;如 HTML、JSP&#xff09;。 核心流程 Controlle…