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

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

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

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


相关文章
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
44 0
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
122 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
48 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
97 1
两个字符串匹配出最长公共子序列算法
|
2月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
2月前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
53 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
27 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
18天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
4天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。