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

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

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

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


相关文章
|
3天前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
172 1
|
5天前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
4天前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
12天前
|
存储 算法 调度
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
|
4天前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
6天前
|
机器学习/深度学习 存储 算法
数据结构与算法:数组的操作
数据结构与算法:数组的操作
|
11天前
|
存储 算法 Java
Java数据结构与算法:用于高效地存储和检索字符串数据集
Java数据结构与算法:用于高效地存储和检索字符串数据集
|
12天前
|
存储 算法 编译器
【数据结构与算法】使用数组实现栈:原理、步骤与应用
【数据结构与算法】使用数组实现栈:原理、步骤与应用
|
13天前
|
存储 算法 Java
Java数据结构与算法:线性数据结构之数组
Java数据结构与算法:线性数据结构之数组
|
13天前
|
算法 Java
Java数据结构与算法:字符串匹配算法之暴力匹配
Java数据结构与算法:字符串匹配算法之暴力匹配