首页 > 编程语言 >每日算法之丑数

每日算法之丑数

时间:2022-12-21 10:24:11浏览次数:48  
标签:丑数 int res 每日 Solution 算法 num public

JZ49 丑数

题目

我们先看到题目,把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。

方法1:质因数分解(暴力)

思路

算法实现

  • 一个很朴素的做法
  • 从1~n每次+1,一直枚举,直到找到地N个丑数为止
  • 那么还有一个待解决的问题,如何判断当前数字是不是丑数呢?
  • 我们总结一下丑数的性质:只能分解为2,3,5的如干次幂相乘的数,即设第个丑数为,则 res = 2*x + 3*y + 5*z
  • 那么我们只需要通过质因数分解,判断他分解2,3,5后,是否为1,如果为1,则说明没有其他的因数,否则则有其他因数,那么他就不是一个丑数

问题
当输入数过大时,需要的时间会很长,所以此方法不行

代码

package mid.JZ49丑数;

import java.util.ArrayList;

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        int current = 1;
        ArrayList<Integer> res = new ArrayList<>();
        res.add(1);
        while(true) {
            if (res.size() == index) {
                return res.get(res.size() - 1);
            }

            current++;

            if (check(current)) {
                res.add(current);
            }
        }
    }
    public boolean check(int num) {
        while(num % 2 == 0) num /= 2;
        while(num % 3 == 0) num /= 3;
        while(num % 5 == 0) num /= 5;
        return num == 1;
    }

    public static void main(String[] args) {
        System.out.println(new Solution().GetUglyNumber_Solution(1500));
    }
}

方法2

思路

  • 有了上面的定义我们就可以知道,丑数的形式就是2x3y5z,所以我们可以定义一个数组res,存储第n个丑数。
  • 因为我们要将丑数按从小到大的顺序排序,所以我们就得将对应的丑数放在对应的下标位置,小的放前面。
  • 这个时候上面我们的出来的丑数的格式就起作用了,丑数的形式无非就是这样2x3y5z,所以我们就将res[n]去乘以 2、3、5,然后比较出最小的那个,就是我们当前的下一个丑数了。

代码

package mid.JZ49丑数;

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if (index <= 6) return index;
        int x = 0, y = 0, z = 0;
        int[] res = new int[index];

        res[0] = 1;

        for (int i = 1; i < index; i++) {
            res[i] = Math.min(res[x]*2, Math.min(res[y]*3, res[z]*5));

            if (res[i] == res[x]*2) x++;
            if (res[i] == res[y]*3) y++;
            if (res[i] == res[z]*5) z++;
        }

        return res[index - 1];
    }
}

标签:丑数,int,res,每日,Solution,算法,num,public
From: https://www.cnblogs.com/loongnuts/p/16995651.html

相关文章

  • JAVA常见算法
    packagecom.example.cesium.utils;publicclassdemo{/***二查分算法*半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中......
  • [算法][解析几何]覆盖最多点固定半径圆问题 POJ1981 圆的扫描线 详细解法
    引题: 覆盖最多点固定半径圆问题改编自POJ1981CircleandPoint 背景:在二维平面中给定n个点,求半径为r的圆最多可以覆盖多少个点(1<=n<=300,精度eps=0.0001)输入......
  • 图解排序算法,这五种最热门!
    介绍5种热门的排序算法,用图文+代码的方式讲解~说到排序算法,大家估计都比较熟悉,但要你一下子写出来又蒙圈了。所以这篇文章不会讲解所有的排序算......
  • 一文带你弄懂 JVM 三色标记算法!
    大家好,我是树哥。最近和一个朋友聊天,他问了我JVM的三色标记算法。我脑袋一愣发现竟然完全不知道!于是我带着疑问去网上看了几天的资料,终于搞清楚啥事三色标记算法,它是用来......
  • Resistance distance 图上2个节点的等效电阻求解算法
    目录​​如何计算正方体网络中(乃至更一般的图)2个节点间的等效电阻?公式的正确性很容易得到验证​​​如何计算Weightedmatrix的Resistancematrix我验证了特例,是对的,......
  • 拓端tecdat|混合IBCF协同过滤推荐算法推荐引擎的探索
    电商行业智能推荐引擎的探索    机器学习助力母婴电商            概要拓端帮助国内母婴电商公司创建智能推荐引擎,由此打造精准、高效的购物体验,探索如何......
  • 常见集群算法解析
    Gossip协议  流行病协议,流言协议分布式网络,无集中管理节点;节点间点对点传播信息。P2P,BITCOIN,REDISCLUSTER等等简单:扩展性:网络节点可任意......
  • C#-记录几个排序算法(选择/插入/冒泡/希尔)
     给定一组数据,使用不同的算法对其进行递增排序:int[]rawList={12,33,21,2,43,5,67,8,96,4,22,36,23,42,90};选择排序:找到最大的数值,交换在最后一......
  • 每日食词—day052
    exposev. n.公开、暴露、露出、揭发、曝光viewportn.视窗、视口consigneen.收货人、收件人、受托人、承销人applicationn.应用、应用程序、应用软件、用......
  • 缓存算法(内存回收算法)- LRU、FIFO、LFU
    题目链接:​​https://oj.leetcode.com/problems/lru-cache/​​DesignandimplementadatastructureforLeastRecentlyUsed(LRU)cache.Itshouldsupportthefol......