通过连接另一个数组的子数组得到一个数组【LC1764】
You are given a 2D integer array groups of length n. You are also given an integer array nums.
You are asked if you can choose n disjoint subarrays from the array nums such that the ith subarray is equal to groups[i] (0-indexed), and if i > 0, the (i-1)th subarray appears before the ith subarray in nums (i.e. the subarrays must be in the same order as groups).
Return true if you can do this task, and false otherwise.
Note that the subarrays are disjoint if and only if there is no index k such that nums[k] belongs to more than one subarray. A subarray is a contiguous sequence of elements within an array.
给你一个长度为 n 的二维整数数组 groups ,同时给你一个整数数组 nums 。
你是否可以从 nums 中选出 n 个 不相交 的子数组,使得第 i 个子数组与 groups[i] (下标从 0 开始)完全相同,且如果 i > 0 ,那么第 (i-1) 个子数组在 nums 中出现的位置在第 i 个子数组前面。(也就是说,这些子数组在 nums 中出现的顺序需要与 groups 顺序相同)
如果你可以找出这样的 n 个子数组,请你返回 true ,否则返回 false 。
如果不存在下标为 k 的元素 nums[k] 属于不止一个子数组,就称这些子数组是 不相交 的。子数组指的是原数组中连续元素组成的一个序列。
这代码是真的丑啊
我滴乖乖 忘记发布了
- 思路:
。使用指针定位数组groups和nums中的元素,指针i定位groups中的某一数组,指针j jj定位groups中数组的某一元素,指针k 定位nums中数组的某一元素。
。从前往后进行匹配,当某一位置匹配不成功时,将nums数组的指针k kk移动到groups[i]首字符的下一位置、groups数组的指针j移动到首字符位置重新匹配,若最后groups中所有子数组均找到对应的子数组,那么返回true
- 实现
class Solution { public boolean canChoose(int[][] groups, int[] nums) { int i = 0, j = 0, k = 0; while (i < groups.length && k < nums.length){ if (groups[i][j] == nums[k]){ j++; k++; if (j == groups[i].length){ i++; j = 0; } }else if (j != 0){ k = k - j + 1; j = 0; }else{ k++; } } return i == groups.length; } }
。复杂度
- 时间复杂度:O(n∗m),n为nums长度,m为group[i]的最大长度
- 空间复杂度:O ( 1 )