中等-LeetCode面试题17.09. 第k个数

题目

来源:第k个数

有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。

示例

在这里插入图片描述

解题思路及代码
1. 思路

初步思路:有一些数,其因数中一定至少有 3 5 7中的一个。找到这些数中的第k个数。创建长度为k的数组,将符合条件的数放入数组中,返回数组最后一个数。

精选题解思路:其实我在想,为什么可以用动态规划。。。
为什么可以用三个指针?
将上述符合条件的数称为丑数。第一个丑数 1 x3/x5/x7会得到新的3个丑数,这三个丑数分别再x3/x5/x7,又可以得到9个丑数,所以这些丑数集合,其实可以看做三个丑数子集合的组合,第一个丑数不断x3形成的一个子集合,以及第一个丑数不断x5,x7形成的子集合。

创建dp数组,dp[n]代表第n个满足题意的数。同时创建三个指针,p3指向的数始终乘以3,p5指向的数始终乘以5,p7 指向的数始终乘以7。因为丑数集合按顺序排列,所以每次往dp数组中添加元素时,都会选择三个指针指向的数中最小的那个。

2. 代码
var getKthMagicNumber = function(k) {
    var p3 = 0;
    var p5 = 0;
    var p7 = 0;
    var dp = new Array(k);
    dp[0] = 1;
    for (let i = 1; i < k; i++) {
        dp[i] = Math.min(dp[p3] * 3, Math.min(dp[p5] * 5, dp[p7] * 7));
        if (dp[i] == dp[p3] * 3) p3++;
        if (dp[i] == dp[p5] * 5) p5++;
        if (dp[i] == dp[p7] * 7) p7++;
    }
    return dp[k-1];
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值