例如寻找2,3,5相乘得到的数字。
即进行状态拆分结果为,F=F+(添加一个新丑数)
添加一个新丑数的方法可以这样。
从当前已有的丑数列表中均乘以2,3,5找到其中最小的那个。作为新丑数。但这样效率也很低。
可以使用三个位置指针。(使用位置指针的地方挺多的)
分别记录2,3,5在当前丑数列表(有序)中的位置。然后顺次取出三个来,比较哪个是最小的。(对于有序数组,这个操作是常见的)
用最小的那个去构建丑数即可。
#抽数列表有序
#抽数列表有序(1用来启发开启测试)
uglys=[1]
#维护的三个位置pos
poss=[0,0,0]
#item
items=[a,b,c]
while True:
#多了一个数字
if len(uglys)==n+1:
return uglys[-1]
#
can_choose=[uglys[poss[i]]*items[i] for i in range(len(poss))]
#找到最小加入
m=min(can_choose)
uglys.append(m)
#找到所有同为最小的地方,指针位置都加一
for i in range(len(can_choose)):
if can_choose[i]==m:
poss[i]+=1
```python