当前位置: 首页 > ai >正文

LintCode第4题-丑数 II

描述

如果一个数只有质数因子235 ,那么这个数是一个丑数。

前10个丑数分别为 1, 2, 3, 4, 5, 6, 8, 9, 10, 12...设计一个算法,找出第N个丑数。

我们可以认为 1 也是一个丑数

1≤n≤1690

样例 1:

输入:

n = 9

输出:

10

解释:

[1,2,3,4,5,6,8,9,10,....],第9个丑数为10。

样例 2:

输入:

n = 1

输出:

1

思路:

先来看O(n²)的思路 后面为O(n)的思路

首先是O(n²)的思路

 从 1 开始逐个生成丑数。

通过除以 2, 3, 5 来最终判断是不是丑数

条件为:

//除的时候要是 2 3 5

//返回的时候要 1 2 3 5才能算是丑数 由于已经把特殊的1包含进去了 所以只需要判断2 3 5即可

类似于LintCode第460题 先取一个数 然后在方法内在进行遍历判断

代码如下:

public class Solution {

    /**

     * @param n: An integer

     * @return: return a  integer as description.

     */

    public int nthUglyNumber(int n) {

        // write your code here

        //除的时候要是 2 3 5

        //返回的时候要 1 2 3 5才能算是丑数

        List<Integer> uglyNumberList=new ArrayList<>();

        //初始化

        uglyNumberList.add(1);

        int returnIndex=0;//1对应的返回值为0

        int m=2;

        while(uglyNumberList.size()<n)

        {

            boolean currentFlag=isCheckUglyNumber(m);

            if(currentFlag)

            {

                uglyNumberList.add(m);

                returnIndex++;

            }

            m++;

           

        }

        return uglyNumberList.get(n - 1);

    }

    boolean isCheckUglyNumber(int m)

    {

        boolean currentFlag=true;

        while(m>1)

        {

            if(m%2==0)

            {

                m=m/2;

            }else if(m%3==0)

            {

                m=m/3;

            }

            else if(m%5==0)

            {

                m=m/5;

            }else

            {

                currentFlag=false;

                return currentFlag;

            }

        }

        return currentFlag;

    }

}

思路2:下面是O(n)的思路  其中三指针法核心思路和动态规划很相似

三指针的三种状态

dp[p2]:表示所有已生成丑数中,下一个乘以 2 的最小值。

dp[p3]:表示所有已生成丑数中,下一个乘以 3 的最小值。

dp[p5]:表示所有已生成丑数中,下一个乘以 5 的最小值

通过已知的丑数( 数组)动态生成下一个最小丑数。

通过三个指针 p2, p3, p5 保持生成有序

public class Solution {

    /**

     * @param n: An integer

     * @return: return the nth ugly number.

     */

    public int nthUglyNumber(int n) {

        if(n<=0)

        {

            return 0;

        }

        int uglyNumbers[]=new int[n];

        uglyNumbers[0]=1;//第一个丑数是 1

        int p2=0,p3=0,p5=0;// 三个指针

        for(int i=1;i<n;i++)

        {

            int uglyNextValue=Math.min(uglyNumbers[p2]*2,Math.min(uglyNumbers[p3]*3,uglyNumbers[p5]*5));// 下一个丑数是三个指针对应数值的最小值

            uglyNumbers[i]=uglyNextValue;

            //更新指针:确保没有重复 注意这里的确保意思为确保每次生成的 “下一个丑数” 是 唯一且最小的

            if(uglyNextValue==uglyNumbers[p2]*2)

            {

                p2++;

            }

            if(uglyNextValue==uglyNumbers[p3]*3)

            {

                p3++;

            }

            if(uglyNextValue==uglyNumbers[p5]*5)

            {

                p5++;

            }

        }

        return uglyNumbers[n-1];

    }

}

http://www.xdnf.cn/news/5383.html

相关文章:

  • java笔记06
  • Three.js + React 实战系列 - 联系方式提交表单区域 Contact 组件✨(表单绑定 + 表单验证)
  • 频率学派和贝叶斯学派置信区间/可信区间的区别
  • spark算子介绍
  • 机器视觉开发教程——C#如何封装海康工业相机SDK调用OpenCV/YOLO/VisionPro/Halcon算法
  • 高精地图数据错误的侵权责任认定与应对之道
  • 【PVE】ProxmoxVE8虚拟机,存储管理(host磁盘扩容,qcow2/vmdk导入vm,vm磁盘导出与迁移等)
  • 数据库分库分表实战指南:从原理到落地
  • 1247. 后缀表达式
  • Compose笔记(二十二)--NavController
  • 数值运算的误差估计
  • DAMA车轮图
  • PyCharm软件下载和配置Python解释器
  • 【英语笔记(八)】介词和冠词的分析;内容涵盖介词构成、常用介词用法、介词短语;使用冠词表示不同的含义:不定冠词、定冠词、零冠词
  • 【Java项目脚手架系列】第六篇:Spring Boot + JPA项目脚手架
  • Git初始化相关配置
  • Vue 跨域解决方案及其原理剖析
  • springboot3+vue3融合项目实战-大事件文章管理系统-更新用户密码
  • 【AI提示词】免疫系统思维专家
  • 英语句型结构
  • ElasticSearch进阶
  • 【C/C++】const关键词及拓展
  • MIT 6.S081 2020 Lab3 page tables 个人全流程
  • 基于Java和高德开放平台的WebAPI集成实践-以搜索POI2.0为例
  • Typora自动对其脚注序号
  • 差分与位移算子
  • PostGreSQL:数据表被锁无法操作
  • JVM-类加载子系统
  • DA14585墨水屏学习(2)
  • Day01 ST表——倍增表