zoukankan      html  css  js  c++  java
  • leetcode 264: Ugly Number II

    Write a program to find the n-th ugly number.

    Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.

    Note that 1 is typically treated as an ugly number.

    思路:

    实际是一个分配2还是3还是5的问题;

    求ans[i]时,遍历ans[i-1]至ans[1],

    循环ans[j]*2,直到找到大于ans[i-1]且最小的值,

    然后从当前位置开始,循环ans[k]*3,找最小值,

    然后从当前位置同样处理ans[m]*5;

    最后对三者求最小值,作为ans[i]。

    注意:

    用long long。

     1 class Solution {
     2 public:
     3     int nthUglyNumber(int n) {
     4         vector<long long> ans(n+1,1);
     5         for(int i=2;i<=n;i++)
     6         {
     7             int j=i-1;
     8             long long tmp;
     9             for(;j>=1;j--)
    10             {
    11                 if(ans[j]*2>ans[i-1])
    12                     tmp = ans[j]*2;
    13                 else
    14                     break;
    15             }
    16             long long tmp2 = tmp;
    17             for(;j>=1;j--)
    18             {
    19                 if(ans[j]*3>ans[i-1])
    20                     tmp2 = ans[j]*3;
    21                 else
    22                     break;
    23             }
    24             long long tmp3 = tmp;
    25             for(;j>=1;j--)
    26             {
    27                 if(ans[j]*5>ans[i-1])
    28                     tmp3 = ans[j]*5;
    29                 else
    30                     break;
    31             }
    32             ans[i] = min(min(tmp,tmp2),tmp3);
    33         }
    34 
    35         //for(int i=1;i<=n;i++)
    36         //    cout<<ans[i]<<" ";
    37         return ans[n];
    38     }
    39 };
    View Code

     ------------------------更新--------------------------

    发现一个更好的算法:见:http://blog.csdn.net/ironyoung/article/details/49045933

    相比于我上面的算法,不必从i-1到0一个一个去试2、3、5,

    而是记录一下2、3、5下次开始考虑的起始位置,

    以3为例,当前乘以3是最小值,下次就不会是在该位置再乘以3,而应往后考虑;

    至于重复值,则过滤;

    复杂度O(N*K)

  • 相关阅读:
    CCF201612-2 工资计算(100分)
    CCF201612-2 工资计算(100分)
    CCF201609-2 火车购票(100分)
    CCF201609-2 火车购票(100分)
    CCF201604-2 俄罗斯方块(100分)
    CCF201604-2 俄罗斯方块(100分)
    CCF201312-2 ISBN号码(100分)
    CCF201312-2 ISBN号码(100分)
    JSP---Sql Jdbc和MySql Jdbc
    JS---正则表达式验证
  • 原文地址:https://www.cnblogs.com/jsir2016bky/p/5752280.html
Copyright © 2011-2022 走看看