【发布时间】:2019-04-04 19:31:45
【问题描述】:
我正在尝试用 sml 编写一个程序,该程序包含列表的长度、列表中出现的最大数量以及当然列表。然后它计算包含所有数字的最小“子列表”的长度。
我尝试使用滑动窗口方法,有两个索引,前和尾。前端首先扫描,当它找到一个数字时,它会在地图中写入它已经看到这个数字的次数。如果程序找到所有数字,则它调用尾部。尾部扫描列表,如果发现某个数字的出现次数超过 1 次,则将其删除。
到目前为止我尝试过的代码如下:
structure Key=
struct
type ord_key=int
val compare=Int.compare
end
fun min x y = if x>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>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>k then
if (elem<>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>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)
但是当我用这个 minimum_sub(10,3,[1,3,1,3,1,3,3,2,2,1]);这没用。我做错了什么??
示例:如果输入是 1,3,1,3,1,3,3,2,2,1 程序应该识别出列表中包含所有数字且最小的部分是 1,3, 3,2 和 3,2,2,1 所以输出应该是 4
【问题讨论】: