算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离

简介: 算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离

牛客.判断是不是平衡二叉树

 public static boolean IsBalanced_Solution (TreeNode pRoot) {
     return dfs(pRoot)!=-1; //如果是-1,表示他不是平衡二叉树
    }
    public static int dfs(TreeNode root){
        if(root==null) return 0;      //当返回值不是-1的时候,返回的是树的高度
        int left=dfs(root.left);      
        if(left==-1) return -1;//剪枝,他用处理,就是他肯定不是平衡二叉树了,就直接不用看了,实际上没啥大用
        int right=dfs(root.right);    //假如这两个值不是-1,那么这两个值里面存储的是数的高度
        if(right==-1)return -1;//剪枝
        return Math.abs(left-right)<=1?Math.max(left,right)+1:-1;
//是平衡二叉树,则返回左树和右树最大值+1
    }

好写,不好想,不好理解

牛客.最大子矩阵

如何枚举出所有的子矩阵

所以枚举的时候,只需要枚举四个斜对角即可。

初始化我们的前缀和

这种用边表示的我不是很懂,所以我画了个图方便大家感受

import java.util.Scanner;
 
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        int[][]a = new int[m + 1][m + 1];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < m; j++) {
                a[i][j] = scanner.nextInt();
            }
        }
        int [][]dp = new int[m + 1][m + 1];
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= m; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + a[i - 1][j - 1];
            }
        }
        int ret = -128;
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= m; j++) {
                for (int x2 = i; x2 <= m; x2++) {
                    for (int y2 = j; y2 <= m; y2++) {
                        ret = Math.max(ret, dp[x2][y2] - dp[x2][j - 1] - dp[i - 1][y2] + dp[i - 1][j -
                                       1]);
                    }
                }
            }
        }
        System.out.println(ret);
 
    }
}

假设染色体有10个,那么我们需要染红5个,才会相同,换句话说只需要选择长度为字符串一半即可

import java.util.*;
 
public class Main { 
    public static void main(String[] args) {
     Scanner scanner=new Scanner(System.in);
      int n=scanner.nextInt();
      scanner.nextLine();
      String b=scanner.nextLine();
      char[]t=b.toCharArray();
      int white0=0;
      int white1=0;
      for(int i=0;i<t.length;i++){
          if(t[i]=='0'){
          white0++;}else
          white1++;
      }
      int count=0;
      int left=0;
      int right=0;
      int half=n/2;
      int red0=0;
      int red1=0;
      while (right<n-1){
          if(t[right]=='0'){
              red0++;
          }else{
              red1++;}
 
          while(right-left+1>half){
               if(t[left]=='0'){
                  red0--;
              }else{
                  red1--;}
 
                  left++;
           }
          if(right-left+1==half){
              if(red0==white0/2&&red1==white1/2)
                  count+=2;
          }
          right++;
      }
        System.out.println(count);
    }
}


两个数组的交集

这个题好久之前做过,但是有点忘了,我最开始想的是排序,后来一看上面写着哈希,但是我哈希又不咋熟,突然想起来模拟哈希。模拟哈希,我开始又在想他是一个数字类型的hash,但是存了半天,又发现他有重复的数字,我不能两个加起来看是不是2 啥的,后来看题解,发现仅仅需要把哈希模拟成一个boolean类型,那么这样如何处理重复, 首先把1号全部设置为true,这样1号没有重复,然后去处理2号,看2号,如果也是要填到这个位置,那么就标记为true,然后我们再去想,处理重复问题,把当前放进去的位置,设置为false.

 public ArrayList<Integer> intersection (ArrayList<Integer> nums1,
                                            ArrayList<Integer> nums2) {
 
        ArrayList<Integer> m = new ArrayList<Integer>();
 
        boolean []hash = new boolean[1001];
 
        for (int i = 0; i < nums1.size(); i++) {
            hash[nums1.get(i)] = true;
        }
        for (int i = 0; i < nums2.size(); i++) {
            if (hash[nums2.get(i)] == true) {
                m.add(nums2.get(i));
                hash[nums2.get(i)] = false;
            }
        }
        return m;
 
        // write code here
    }
}

牛客.数组中两个字符串的最小距离

思路:就是我们在遍历的过程中,我们使用两个变量,存储(我们判断好,哪个是相等的之后,我们要找距离这个位置最近的另一个变量,所以我们设置prev1是第一个,prev第二个

然后我们当找到第一个的时候,看看前面有没有另一个,如果有,那么就去更新,假如没有那么就去更新当前的prev1

   Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
 
        String b = scanner.next();
        String c = scanner.next();
        String[] t = new String[a];
        scanner.nextLine();
        for (int i = 0; i < a; i++) {
            t[i] = scanner.nextLine();
        }
        int prev1 = -1;
        int prev2 = -1;
        int count = 0x3f3f3f3f;
        for (int i = 0; i < a; i++) {
            if (b.equals(t[i]) == true) {
                if (prev2 != -1) {
                    count = Math.min(Math.abs(i - prev2), count);
                }
                prev1 = i;
            } else  if (c.equals(t[i]) == true) {
                if (prev1 != -1) {
                    count = Math.min(Math.abs(i - prev1), count);
                }
                prev2 = i;
            }
        }
        if (count == 0x3f3f3f3f)
            System.out.println(-1);else{
        System.out.println(count);}
    }


相关文章
|
15天前
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
31 7
|
1月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
79 23
|
5月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
216 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
5月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
94 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
4月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
5月前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
98 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
5月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
63 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
10天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
|
21小时前
|
算法 数据安全/隐私保护
基于GA遗传算法的拱桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现拱桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率要求(0.95≤ηq≤1.05),目标是使ηq尽量接近1,同时减少车辆数量和布载耗时。程序在MATLAB 2022A版本下运行,展示了工况1至工况3的测试结果。通过优化模型,综合考虑车辆重量、位置、类型及车道占用等因素,确保桥梁关键部位承受最大荷载,从而有效评估桥梁性能。核心代码实现了迭代优化过程,并输出最优布载方案及相关参数。
|
5天前
|
机器学习/深度学习 存储 算法
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。