leetcode题目:第 k 个数

该博客介绍了如何使用动态规划算法找到只含有3、5、7这三个素因子的第k个数。通过设置三个指针分别对应3、5、7的倍数,不断比较并更新最小值来构建序列,避免重复。示例代码给出了Java实现,展示了解决这类问题的具体步骤。
摘要由CSDN通过智能技术生成

题目描述:

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

示例 1:

输入: k = 5

输出: 9

解题思路:

由题可得,数组应为3a*5b*7c,即每个数字都是列表中先前值的 3 倍、5 倍或 7 倍,因此我们可以检查所有可能的值。但要注意防止重复出现的数字。因此用动态规划DP来解决。

DP动态规划一般用三指针来实现。

举个例子
初始值 ugly[0]=1; index1=0; index2=0; index3=0


ugly[1]=Min(ugly[index1]*3,ugly[index2]*5,ugly[index3]*7)
=Min(1*3,1*5,1*7)
=3
于是 index1++;

ugly[2]=Min(ugly[index1]*3,ugly[index2]*5,ugly[index3]*7)
=Min(3*3,1*5,1*7)
=5
于是 index2++;
以此类推。

java代码实现

class Solution {
    public int getKthMagicNumber(int k) {
        int p1=0,p2=0,p3=0;
        int[] dp=new int[k];
        dp[0]=1;

        for(int i=1;i<k;i++){
            dp[i]=Math.min(Math.min(dp[p1]*3,dp[p2]*5),dp[p3]*7);
            if(dp[i]==dp[p1]*3){
                p1++;
            }
            if(dp[i]==dp[p2]*5){
                p2++;
            }
            if(dp[i]==dp[p3]*7){
                p3++;
            }
        }
        return dp[k-1];
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小谢先生

支持知识付费

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

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

打赏作者

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

抵扣说明:

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

余额充值