zoukankan      html  css  js  c++  java
  • 剑指offer:丑数

    题目描述:

    把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

    解题思路:

    1. 常规思路,从1开始到index判断每个数是否是丑数,但这样时间上肯定过不了,因为存在重复计算。

    2. 用空间换时间的思路,发现每一个丑数都是由之前的丑数乘2,3或5得到的,所以考虑从第一个丑数开始向后推到第index个。由于需要维持一个有序的丑数序列,对于每个丑数都分别乘2,3,5这三个基数,取大于当前丑且最小的那个数放入序列。一轮选完后,需要调整每个基数在下一轮乘的丑数,即未被选中的基数的保持原位,选中的向后移动一位。

    注意对于边界条件的考虑,这里小于1的情况常规认为不可能发生,但是没有判断即报错。

    代码:

     1 class Solution {
     2 public:
     3     int GetUglyNumber_Solution(int index) {
     4         if(index<1)
     5             return 0;
     6         vector<int> uglynumber(index, 0);
     7         uglynumber[0] = 1;
     8         int ugly2=0, ugly3=0, ugly5=0;
     9         int cur_index=1;
    10         for(int i=1; i<index; i++)
    11         {
    12             int cur_ugly = min(uglynumber[ugly2]*2, min(uglynumber[ugly3]*3, uglynumber[ugly5]*5));
    13             uglynumber[cur_index] = cur_ugly;
    14             cur_index++;
    15             while(cur_ugly >= uglynumber[ugly2]*2)
    16             {
    17                 ugly2++;
    18             }
    19             while(cur_ugly >= uglynumber[ugly3]*3)
    20             {
    21                 ugly3++;
    22             }
    23             while(cur_ugly >= uglynumber[ugly5]*5)
    24             {
    25                 ugly5++;
    26             }
    27 
    28         }
    29         return uglynumber[index-1];
    30     }
    31 };
  • 相关阅读:
    一类分治问题
    [POI2005]DWU-Double-row
    [SCOI2007]降雨量
    [POI2007]ODW-Weights(贪心)
    bzoj3427小P的牧场(斜率优化dp)
    UVA10559 Blocks(区间dp)
    LOJ6089 小Y的背包计数问题(根号优化背包)
    [APIO2008]免费道路(生成树)
    bzoj4383(拓扑排序)
    [HEOI2014]平衡(整数划分数)
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10957198.html
Copyright © 2011-2022 走看看