<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實戰(zhàn)444:序列重建

          共 1750字,需瀏覽 4分鐘

           ·

          2021-11-26 19:47

          算法的重要性,我就不多說了吧,想去大廠,就必須要經過基礎知識和業(yè)務邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做?序列重建,我們先來看題面:
          https://leetcode-cn.com/problems/sequence-reconstruction/

          Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. The org sequence is a permutation of the integers from 1 to n, with 1 ≤ n ≤ 104. Reconstruction means building a shortest common supersequence of the sequences in seqs (i.e., a shortest sequence so that all sequences in seqs are subsequences of it). Determine whether there is only one sequence that can be reconstructed from seqs and it is the org sequence.


          驗證原始的序列 org 是否可以從序列集 seqs 中唯一地重建。
          序列 org 是 1 到 n 整數的排列,其中 1 ≤ n ≤ 104。
          重建是指在序列集 seqs 中構建最短的公共超序列。(即使得所有 seqs 中的序列都是該最短序列的子序列)。
          確定是否只可以從 seqs 重建唯一的序列,且該序列就是 org 。

          示例

          示例 1
          輸入:
          org: [1,2,3], seqs: [[1,2],[1,3]]
          輸出:
          false
          解釋:
          [1,2,3]?不是可以被重建的唯一的序列,因為 [1,3,2]?也是一個合法的序列。
          ?
          示例 2
          輸入:
          org: [1,2,3], seqs: [[1,2]]
          輸出:
          false
          解釋:
          可以重建的序列只有 [1,2]。
          ?
          示例 3
          輸入:
          org: [1,2,3], seqs: [[1,2],[1,3],[2,3]]
          輸出:
          true
          解釋:
          序列 [1,2], [1,3]?和 [2,3]?可以被唯一地重建為原始的序列 [1,2,3]

          示例 4
          輸入:
          org: [4,1,5,2,6,3], seqs: [[5,2,6,3],[4,1,5,2]]
          輸出:
          true


          解題

          https://blog.csdn.net/weixin_44171872/article/details/108865453

          主要思路:
          (1)先判斷給出的序列集中包含的所有元素,是否是1到 n的所有的元素;
          (2)根據給出的序列集,建立出度的有向圖,并統(tǒng)計各個點的入度;
          (3)在建好的圖中,進行拓撲排序,且保證只能建立一種順序,則排序的過程中,要保證每次排序時,起始的結點,既入度為0的點只有一個(這個使用隊列的大小進行判斷);
          (4)對排好的序列,進行判斷,既首先大小要和給出的數組相同,其次,各個元素要相同;

          class?Solution?{
          public:
          ????bool?sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs)?{
          ????????int?n=org.size();
          ????????//統(tǒng)計序列集中的各個元素,保證所有的元素是唯一的1到n的數字
          ????????vector<bool> signs(n+1,false);
          ????????for(vector<int>& vec:seqs){//統(tǒng)計
          ????????????for(int&num:vec){
          ????????????????if(num>n||num<=0){//保證不越界
          ????????????????????return?false;
          ????????????????}
          ????????????????signs[num]=true;
          ????????????}
          ????????}
          ????????for(int?i=1;i<=n;++i){//判斷元素的是否符合要求
          ????????????if(!signs[i]){
          ????????????????return?false;
          ????????????}
          ????????}
          ????????//建有向出度圖和統(tǒng)計入度
          ????????vector<vector<int>> graph(n+1);
          ????????vector<int> indegree(n+1,0);
          ????????for(vector<int>& vec:seqs){
          ????????????for(int?i=0;i-1;++i){
          ????????????????graph[vec[i]].push_back(vec[i+1]);
          ????????????????++indegree[vec[i+1]];
          ????????????}
          ????????}
          ????????//找出起始的結點
          ????????queue<int> q;
          ????????for(int?i=1;i<=n;++i){
          ????????????if(indegree[i]==0){
          ????????????????q.push(i);
          ????????????}
          ????????}
          ????????vector<int> res;//存儲排序后的序列
          ????????while(!q.empty()){
          ????????????if(q.size()>1){//保證只有一種序列
          ????????????????return?false;
          ????????????}
          ????????????//取出當前結點
          ????????????int?cur=q.front();
          ????????????q.pop();
          ????????????res.push_back(cur);
          ????????????//更新相關的入讀圖
          ????????????for(int& num:graph[cur]){
          ????????????????--indegree[num];
          ????????????????if(indegree[num]==0){//統(tǒng)計新的起始點
          ????????????????????q.push(num);
          ????????????????}
          ????????????}
          ????????}
          ????????//先判斷大小
          ????????if(res.size()!=n){
          ????????????return?false;
          ????????}
          ????????//再判斷一致性
          ????????return?res==org;
          ????}
          };


          好了,今天的文章就到這里,如果覺得有所收獲,請順手點個在看或者轉發(fā)吧,你們的支持是我最大的動力 。

          上期推文:

          LeetCode1-440題匯總,希望對你有點幫助!

          LeetCode刷題實戰(zhàn)441:排列硬幣

          LeetCode刷題實戰(zhàn)442:數組中重復的數據

          LeetCode刷題實戰(zhàn)443:壓縮字符串


          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色小说视频网站 | 肏屄一级片 | 久热久草 | 五月婷婷精品 | 91ThePorn国产在线观看 |