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)

  • 相关阅读:
    Redis学习笔记-安装篇(Centos7)
    图片上传预览方式,了解下?
    Angular中依赖注入方式的几种写法
    Javascript实现打开或退出浏览器全屏
    从头开始学Web开发—CSS_01
    JavaScript DOM知识 (一)
    javascript中的scroll事件
    javascript中继承的实现
    认识Javascript中的作用域和作用域链
    javascript中的闭包
  • 原文地址:https://www.cnblogs.com/jsir2016bky/p/5752280.html
Copyright © 2011-2022 走看看