算法,求从小到大排序的1500个丑数

丑数:只包含因子2,3,5的数称为丑数

解这个题的方法,生成法,滚雪球一样,越滚越大,假设我们已经有n个最小的丑数集合S,且已经从小到大排好序,下面我们要找下一个丑数,这个丑数必定是2,3,5与集合S的乘积中大于Smax且是最小的。所以我们可以首先用2乘以集合S,找到大于Smax的最小的数T2,再重复找到T3,T5。取T2,T3,T5的最小值。 注:其实我们可以达到o(n)的时间计算复杂度,这还蛮经典的,我们增加3个变量max2,max3,max5,M是当前递增丑数序列的最大数。如果上一步是3乘以集合S得到的数M,这四者的关系是2*D[max2]<3*D[max3+1],5*D[max5] 2*D[max2]<=M<2*D[max2+1],3*D[max3]<=M<3*D[max3+1],5*D[max5]<=M<5*D[max5+1],也即下一步我们只要比较这三个数2* D[max2+1], 3*D[max3+1],5* D[max5+1]中的最小者,如果是 5* D[max5+1],那么max5++,且把 5* D[max5+1]取为我们要的下一个丑数, 其余两个数max2,max3还是不变。此时我们仍旧有 2*D[max2]<=M<2*D[max2+1],3*D[max3]<=M<3*D[max3+1],5*D[max5]<=M<5*D[max5+1]的关系。下面继续比较。可见时间复杂度,如果我们要n的丑数就是o(n^2)

还有个题,给一个重量a克的物体A,还已知我们有3^n克的砝码各一个,n=0,1,...k,...。A物体必须放在天平上,其他的任选。怎么是天平平衡?

我的办法,从n=0开始,求出所有可能的差的组合,检查a是否在里面,不在的话让n++,继续下一步。
我们这里采用分治法时求子问题不是从a开始往下减,而是从n开始,为什么呢,因为a-1的规模并不一定比a小,但是n-1的规模一定比n小。同时这里还有个技术室把问题转化,放大。我们不能直接求出答案,我们求出所有的差,那么如果a在这个集合里,那么问题就解决了。
观察3^n这个数列的特性,会发现,如果使用了3^k,那么最小是(3^k+1)/2,不使用3^k,那么这个数最大是(3^k-1)/2。而 (3^k-1)/2和 (3^k+1)/2又是相邻的两个数。这样就可以确定是否含有3^k了。如果一个数x,在[(3^m)/2 +1 ,(3^(m+1))/2 )那么必然包含3^m这个数。怎么求这个呢,可以从1开始,不断乘以3,然后和x比较是否比x大,直到第一个比x大的数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zlingh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值