剑指 Offer II 115. 重建序列

剑指 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进行操作;
  • 本题还可以使用拓扑排序做,有时间补。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值