• LeetCode 264


    题目连接:https://leetcode-cn.com/problems/ugly-number-ii/solution/

    编写一个程序,找出第 n 个丑数。

    丑数就是只包含质因数 2, 3, 5 的正整数。

    示例:

    输入: n = 10
    输出: 12
    解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
    说明:  

    1 是丑数。
    n 不超过1690。
    通过次数21,570提交次数42,291

    首先先上代码

    class Solution {
        public int nthUglyNumber(int n) {
            if(n<7){
                return n;
            }
            int pos2=0,pos3=0,pos5=0;
            int[] array = new int[n];
            array[0] =1;
            for(int i = 1; i < n;i++){
                array[i] = Math.min(array[pos2]*2,Math.min(array[pos3]*3,array[pos5]*5));
                if( array[i] == array[pos2]*2)
                    pos2++;
                if( array[i] == array[pos3]*3)
                    pos3++;
                if( array[i] == array[pos5]*5)
                    pos5++;
            }
            return array[n-1];
        }
    }
    

      一行一行的来分析代码。

    首先由示例我们知道,1-6都是所谓的丑数,所以为了加快程序运行,直接进行判断后返回即可。

    其次,该方法使用了三指针的思想,让我们来具体分析一下。

    由于题目将丑数定义为其质因数只能为2,3,5.那么它肯定是由{2,3,5}这三个数乘于一定的倍数而来的。那我们使用pos2,pos3,pos5来记录这三个质因数的上一轮的位置。

    第一轮

    array[0] =1;

    array[pos2]*2= 2;

    array[pos3]*3=3;

    array[pos5]*5=5;

    因为题目要求我们按照升序的顺序来排列,所以取这三个数中较小的数存入array[1]中。即为2.

    第二轮

    array[0]=1,array[1]=2;

    array[pos2]*2 = 2;

    array[pos3]*3=3;

    array[pos5]*5=5;

    问题出现了,pos2位置的数的2的倍数出现了重复,因为我们在上一轮已经使用过这个数来进行比较了,所以我们应该在上一轮将这个数进行更新。

                if( array[i] == array[pos2]*2)
                    pos2++;
                if( array[i] == array[pos3]*3)
                    pos3++;
                if( array[i] == array[pos5]*5)
                    pos5++;
            }
    

      

  • 相关阅读:
    C++ string 类详解
    C语言 -- 字符串详解
    基本数据结构 -- 链表的遍历、查找、插入和删除
    Shell 基础 -- 总结几种括号、引号的用法
    用 C 语言描述几种排序算法
    Win10 + vs2017 编译并配置tesseract4.1.0
    前端如何引入vConsole
    php设计模式-数据对象映射模式
    PHP设计模式-策略模式
    PHP设计模式-适配器模式
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/12652397.html
Copyright © 2020-2023  润新知