title: Smallest sub-list that contains all numbers
body: <p>I am trying to write a program in sml that takes in the length of a list, the max number that will appear on the list and the list of course. It then calculates the length of the smallest "sub-list" that contains all numbers. </p>
  
  <p>I have tried to use the sliding window approach , with two indexes , front and tail. The front scans first and when it finds a number it writes into a map how many times it has already seen this number. If the program finds all numbers then it calls the tail. The tail scans the list and if it finds that a number has been seen more times than 1 it takes it off.</p>
  
  <p>The code I have tried so far is the following:</p>
  
  <pre><code>structure Key=
   struct
    type ord_key=int
    val compare=Int.compare
   end
  
  
  fun min x y = if x&gt;y then y else x;
  
  
  structure mymap = BinaryMapFn ( Key  );
  
  fun smallest_sub(n,t,listall,map)=
  let
   val k=0
   val front=0
   val tail=0
  
   val minimum= n; 
  
   val list1=listall;
   val list2=listall;
  
   fun increase(list1,front,k,ourmap)=
    let 
     val number= hd list1
     val elem=mymap.find(ourmap,number)
     val per=getOpt(elem,0)+1
  
     fun decrease(list2,tail,k,ourmap,minimum)=
      let 
       val number=hd list2
       val elem=mymap.find(ourmap,number)
       val per=getOpt(elem,0)-1
       val per1=getOpt(elem,0)
      in
       if k&gt;t then
        if (per1=1) then decrease(tl list2,tail+1,k-1,mymap.insert(ourmap,number,per),min minimum (front-tail))
        else decrease(tl list2,tail+1,k,mymap.insert(ourmap,number,per),min minimum (front-tail))
       else increase (list1, front,k,ourmap)
      end
  
    in
     if t&gt;k then
      if (elem&lt;&gt;NONE) then increase (tl list1,front+1,k,mymap.insert(ourmap,number,per))
      else increase(tl list1,front+1,k+1,mymap.insert(ourmap,number,per))
     else (if (n&gt;front) then decrease(list2,tail,k,ourmap,minimum) else minimum)
    end
  
  
  in
    increase(list1,front,k,map)
  end
  
  
  fun solve (n,t,acc)= smallest_sub(n,t,acc,mymap.empty)
  </code></pre>
  
  <p>But when I call it with this smallest_sub(10,3,[1,3,1,3,1,3,3,2,2,1]); it does not work. What have I done wrong??</p>
  
  <p>Example: if input is 1,3,1,3,1,3,3,2,2,1 the program should recognize that the parto of the list that contains all numbers and is the smallest is 1,3,3,2 and 3,2,2,1 so the output should be 4</p>