剑指 Offer II 115. 重建序列
题目描述
给定一个长度为 n 的整数数组 nums ,其中 nums 是范围为 [1,n] 的整数的排列。还提供了一个 2D 整数数组 sequences ,其中 sequences[i] 是 nums 的子序列。
检查 nums 是否是唯一的最短 超序列 。最短 超序列 是 长度最短 的序列,并且所有序列 sequences[i] 都是它的子序列。对于给定的数组 sequences ,可能存在多个有效的 超序列 。例如,对于 sequences = [[1,2],[1,3]] ,有两个最短的超序列 ,[1,2,3] 和 [1,3,2] 。
而对于 sequences = [[1,2],[1,3],[1,2,3]] ,唯一可能的最短 超序列 是 [1,2,3] 。[1,2,3,4] 是可能的超序列,但不是最短的。
如果 nums 是序列的唯一最短 超序列 ,则返回 true ,否则返回 false。
子序列 是一个可以通过从另一个序列中删除一些元素或不删除任何元素,而不改变其余元素的顺序的序列。来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ur2n8P
思路
因为只有子序列中出现相邻的数对,才可以判断出nums
中存在这样的数对,所以只需要对子序列进行一次遍历,对于出现的数对进行标记,最终检验n
个数,如果都已被标记,就说明符合要求,否则就不符合。
代码
class Solution {
public:
bool sequenceReconstruction(vector<int>& nums, vector<vector<int>>& sequences) {
int n = nums.size();
int s = sequences.size();
int judge[10005]={0};
int a[10005] = {0};
for(int i=0;i<n;i++)
{
a[nums[i]]=i;
}
for(int i=0;i<s;i++)
{
int ss=sequences[i].size();
for(int j=0;j<ss-1;j++)
{
if(a[sequences[i][j+1]]-a[sequences[i][j]]==1)
judge[a[sequences[i][j]]]=1;
}
}
int ans=0;
for(int i=0;i<n;i++)
ans+=judge[i];
return ans+1==n;
}
};
收获
- 我这里对于偏序关系的映射是用了普通的一个数组,也可以使用
unordered_map
进行操作; - 本题还可以使用拓扑排序做,有时间补。