- 2022-05-18:假设数组a和数组b为两组信号:
length(b) <= length(a);
对于任意0<=i<length(b), 有b[i+1] - b[i] == a[i+1] - a[i]。
那么就称信号b和信号a一致,记为b==a,
给你好多b数组,假设有m个: b0数组、b1数组…
给你好多a数组,假设有n个: a0数组、a1数组…
返回一个长度为m的结果数组ans,ans[i]表示 : bi数组和多少个a数组一致。
来自字节飞书团队。
————————————————
版权声明:本文为CSDN博主「福大大架构师每日一题」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_48502062/article/details/124849363
public int[] sameTeamsArray(int[][] bs,int[][] as){
//预测 循环比较
//预测 新建一个类
//预测
//b数组的长度
int m = bs.length;
//新建节点
TrieNode root = new TrieNode();
//新建当前节点
TrieNode cur = null;
//循环b数组
for (int i=0;i<m;i++){
//获取其中子数组的长度
int k = bs[i].length;
//将root节点给当前节点
cur = root;
//循环其中的其中一个子数组
for (int j=1;j<k;j++){
//俩个元素的差值
int diff = bs[i][j] - bs[i][j-1];
//预判 当前节点不包含这个差值
if (!cur.nexts.containsKey(diff)){
//将当前的差值给放入下一节点中
cur.nexts.put(diff,new TrieNode());
}
//预判 当前的节点包含这个差值
//当前节点切换
cur = cur.nexts.get(diff);
}
//当前节点集合放入当前节点
cur.indices.add(i);
}
//新建返回数组
int[] ans = new int[m];
//定义a数组的长度
int n = as.length;
//循环a数组
for (int i=0;i<n;i++){
//其中一个子数组的长度
int k = as[i].length;
//定义当前节点
cur = root;
//循环其中的一个子数组
for (int j=1;j<k;j++){
//计算差值
int diff = as[i][j] - as[i][j-1];
//预判 当前节点不包含这个差值
if (!cur.nexts.containsKey(diff)){
//这个子数组不行
break;
}
//预判 是有这个节点的
cur = cur.nexts.get(diff);
//循环这个节点里面的b下标列表
for (int index : cur.indices) {
ans[index]++;
}
}
}
return ans;
}
//新建前缀树节点
class TrieNode{
//新建列表
public ArrayList<Integer> indices;
//新建关系表
public HashMap<Integer, TrieNode> nexts;
//初始化
public TrieNode(){
indices = new ArrayList<>();
nexts = new HashMap<>();
}
}
- 前缀树