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)

  • 相关阅读:
    强迫症
    bzoj1758 [Wc2010]重建计划
    bzoj1070 [SCOI2007]修车
    bzoj3675 [Apio2014]序列分割
    bzoj1010 [HNOI2008]玩具装箱toy
    bzoj3697 采药人的路径
    bzoj2152 聪聪可可
    bzoj2599 [IOI2011]Race
    Ubuntu 18.04 LTS 下 GTK3 安装与编译
    启动或重启 dnsmasq 提示端口 53 被占用的解决方案
  • 原文地址:https://www.cnblogs.com/jsir2016bky/p/5752280.html
Copyright © 2011-2022 走看看