【刷力扣】练习JAVA 六(313. 超级丑数)

!!!!!【此文章仅仅用于记录自己做题,文章毫无用处⚆_⚆】

此题要在前两道题的前提下做,对题目理解会好些,一开始题目没看懂,看了讨论有人说要看看前两道关于丑数的题。263.丑数、264.丑数Ⅱ。所以先做了前两道题。

目录

263.丑数

一、题目:

二、解答以及代码:

264.丑数Ⅱ

一、题目

二、解答

解法:动态规划

三、代码

313.超级丑数

一、题目

二、解答

三、代码


263.丑数

一、题目:

 

二、解答以及代码:

题目较简单,将三个数2,3,5存入数组中,while循环除(比如2)直至除不尽,则到下一个数(比如3)继续while循环。

官方解答比较容易理解

class Solution {
    public boolean isUgly(int n) {
        if (n<=0)
        return false;
        int []ugly={2,3,5};
        for(int nums:ugly)//foreach型数组遍历
        {
            while(n%nums==0)//一直除nums直至除不尽,就到出循环,到下一个数
            n/=nums;
        }
        return n==1;//简化版。即若n==1则true除尽了,若n!=1,则为false

    }
}

public class MainClass {
    public static String booleanToString(boolean input) {
        return input ? "True" : "False";
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = in.readLine()) != null) {
            int n = Integer.parseInt(line);
            
            boolean ret = new Solution().isUgly(n);
            
            String out = booleanToString(ret);
            
            System.out.print(out);
        }
    }
}

264.丑数Ⅱ

一、题目

二、解答

  官方解答只是用了第二种动态规划。第一种是最小堆,然后又哈希集合来避免重复,还没有看懂,就只使用了动态规划方法。

官方解释挺详细易懂的。

解法:动态规划

三、代码

class Solution {
    public int nthUglyNumber(int n) {
        int []dp=new int[n+1];
        dp[1]=1;
        int p1=1,p2=1,p3=1;
        for(int i=2;i<=n;i++)
        {
            int num2=dp[p1]*2,num3=dp[p2]*3,num5=dp[p3]*5;
            dp[i] = Math.min(Math.min(num2, num3), num5);
            if(dp[i]==num2)
            p1++;
            if(dp[i]==num3)
            p2++;
            if(dp[i]==num5)
            p3++;
        }
        return dp[n];

    }
}

313.超级丑数

一、题目

 

二、解答

     

这道题和「264. 丑数 II」相似,区别在于,第 264 题规定丑数是只包含质因数 2、3 和 5 的正整数,这道题规定超级丑数是只包含数组primes 中的质因数的正整数。

这道题可以使用第 264 题的方法,包括最小堆和动态规划。

同样只使用了官方的第二种解法动态规划

三、代码

class Solution {
    public int nthSuperUglyNumber(int n, int[] primes) {
        int m=primes.length;
        int []dp=new int[n+1];
        dp[1]=1;
        
        int []pointer=new int[m];//每个所给质数指针,相当于264丑数二中的p1p2p3;
        Arrays.fill(pointer,1);//都初始化为1
        for(int i=2;i<=n;i++)
        {
            int []num=new int[m];
            int minNum=Integer.MAX_VALUE;
            for(int j=0;j<m;j++)
            {
                num[j]=dp[pointer[j]]*primes[j];
                minNum=Math.min(minNum,num[j]);
            }
            dp[i]=minNum;
            for(int j=0;j<m;j++)
               if(minNum==num[j])
                   pointer[j]++;

        }
        return dp[n];


    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值