目录
题目
给你一个长度为 n
的二维整数数组 groups
,同时给你一个整数数组 nums
。
你是否可以从 nums
中选出 n
个 不相交 的子数组,使得第 i
个子数组与 groups[i]
(下标从 0 开始)完全相同,且如果 i > 0
,那么第 (i-1)
个子数组在 nums
中出现的位置在第 i
个子数组前面。(也就是说,这些子数组在 nums
中出现的顺序需要与 groups
顺序相同)
如果你可以找出这样的 n
个子数组,请你返回 true
,否则返回 false
。
如果不存在下标为 k
的元素 nums[k]
属于不止一个子数组,就称这些子数组是 不相交 的。子数组指的是原数组中连续元素组成的一个序列。
题目分析:将二维数组的子数组连接起来之后可以在nums数组中找到可以匹配的子数组,则返回true,否则返回true
oj链接
1764. 通过连接另一个数组的子数组得到一个数组 - 力扣(Leetcode)
方法 遍历法
将groups二维数组的子数组(groups[i])拿出来和nums数组进行匹配。在遍历子数组时,利用变量t记录nums数组匹配的起点k,当匹配失败后,将匹配的起点前进一步。同时,需要重置匹配起点。
代码实现
public boolean canChoose(int[][] groups, int[] nums) {
int k = 0;//记录nums数组的下标
for(int i = 0;i < groups.length;i++) {
int j = 0;
int t = k;//记录每次nums数组开始和子数组匹配的起点
while(j < groups[i].length && k < nums.length) {
if(groups[i][j] == nums[k]) {
k++;
j++;
}else {
//在nums数组中遍历不到数组groups[i],让k再前进一步再重新遍历
//这时候需要重新记录k的起点
k = t + 1;
t++;
j = 0;
}
}
if(k == nums.length && j != groups[i].length) {
return false;
}
}
//结束循环 结果为true groups的所有数组都匹配成功
return true;
}
总结
坑一:
绿框代码:在匹配失败时,需要重新回头开始匹配,头是原来起点的下一个元素,所以在每次匹配时都要记录匹配的起点,方便回头。
匹配失败只有一种情况,即将nums数组遍历完后,groups数组还没被匹配完。