How to find minimal-length subsequence that contains all element of a sequence

后端 未结 7 1448
无人共我
无人共我 2021-02-01 07:29

Given a sequence such as S = {1,8,2,1,4,1,2,9,1,8,4}, I need to find the minimal-length subsequence that contains all element of S (no duplicates, order does n

7条回答
  •  囚心锁ツ
    2021-02-01 08:11

    above solution is correct and java version of above code

    public class MinSequence {
    
        public static void main(String[] args)
        {
            final int n; // the size of array
            // read n and the array
            final List arr=new ArrayList(4);
            Map cur = new TreeMap();
            arr.add(1);
            arr.add(2);
            arr.add(1);
            arr.add(3);
            int distinctcount=0;
            for (final Integer integer : arr)
            {
                if(cur.get(integer)==null)
                {
                    cur.put(integer, 1);
                    ++distinctcount;
                }else
                {
                    cur.put(integer,cur.get(integer)+1);
                }
            }
    
            // now k is the number of distinct elements
            cur=new TreeMap();
            //   memset( cur, 0, sizeof( cur )); // we need this array anew
            int begin = 0, end = -1; // to make it 0 after first increment
            int best = -1; // best answer currently found
            int ansbegin = 0, ansend = 0; // interval of the best answer currently found
            int cnt = 0; // distinct elements in current subsequence
            final int inpsize = arr.size();
            while(true)
            {
                if( cnt < distinctcount )
                {
                    ++end;
                    if (end == inpsize) {
                        break;
                    }
                    if( cur.get(arr.get(end)) == null ) {
                        ++cnt;
                        cur.put(arr.get(end), 1);
                    } // this elements wasn't present in current subsequence;
                    else
                    {
                        cur.put(arr.get(end),cur.get(arr.get(end))+1);
                    }
                    continue;
                }
                // if we're here it means that [begin, end] interval contains all distinct elements
                // try to shrink it from behind
                while (cur.get(arr.get(begin)) != null && cur.get(arr.get(begin)) > 1) // we have another such element later in the subsequence
                {
                    cur.put(arr.get(begin),cur.get(arr.get(begin))-1);
                    ++begin;
                }
                // now, compare [begin, end] with the best answer found yet
                if( best == -1 || end - begin < best )
                {
                    best = end - begin;
                    ansbegin = begin;
                    ansend = end;
                }
                // now increment the begin iterator to make cur < k and begin increasing the end iterator again
                if (cur.get(arr.get(begin)) != null) {
                    cur.put(arr.get(begin),cur.get(arr.get(begin))-1);
                }
                ++begin;
                --cnt;
            }
    
            // output the [ansbegin, ansend] interval as it's the answer to the problem
            System.out.println(ansbegin+"--->"+ansend);
            for( int i = ansbegin; i <= ansend; ++i ) {
                System.out.println(arr.get(i));
            }
        }
    

提交回复
热议问题