• 得到从小到大的第N个丑数的三种方式(C++)一维动态规划


    1、从1开始的数,逐个判断是不是丑数。直到第N个输出

    2、该方法目前还有bug,原因不明,理论上应该能做

    每个丑数其实都是由之前的丑数乘2或者乘3或者乘以5得到的

    使用一个set容器避免重复,使用一个优先队列存放丑数,每次得到最小的丑数,并且把最小的丑数乘2,乘3,乘以5。这三个结果分别不在set容器中,则放入优先队列和set容器。

    得到最小的丑数的次数等于N时,得到结果。

    3、使用三个遍历标签i2,i3,i5,分别代表每个数进行*2,乘3乘以5操作。每次得到这三个操作中得到的最小的数

    代码三和代码二中的文件操作是为了对比哪一步出现了错误

    代码三

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<fstream>
    using namespace std;
    class Solution {
    public:
        int GetUglyNumber_Solution(int index) {
            //中间过程变量输出到文件
            ofstream out("out3.txt", ios::out); 
              int i2 = 0,i3 = 0,i5 = 0;
              int ret = 0;
              int temp = 1;
              int count = 1;
            vector<int> vec;
            vec.push_back(1);
            out<<1<<endl;
            while (true) 
            {
                if (count >= index)
                {
                    ret = temp;
                    break;
                }
                temp = min(vec[i2] * 2,min(vec[i3] * 3, vec[i5] * 5));
                out<<temp<<endl; 
                if (temp == vec[i2] * 2)
                {
                    i2++;
                }
                if (temp == vec[i3] * 3)
                {
                    i3++;
                }
                if (temp == vec[i5] * 5)
                {
                    i5++;
                }
                count++;    
                vec.push_back(temp);    
            }
            if (out.is_open())
            {
                out.close();
            }
            return ret;
        }
    };
    int main()
    {
        cout<<Solution().GetUglyNumber_Solution(1500)<<endl;
        return 0;
    }

    代码二

    #include<iostream>
    #include<queue>
    #include<set> 
    #include<fstream>
    //通过优先队列来得到丑数 
    using namespace std;
    //用来构造优先队列最小堆 
    struct cmp {
        public:
        bool operator()(int a,int b)
        {
            if (a < b)
            {
                return false;
            }
            return true;
        } 
    };
    
    class Solution {
    public:
        int GetUglyNumber_Solution(int index) {
            //中间过程信息打印到文件中
            ofstream out;
            out.open("out2.txt",ios::out); 
            priority_queue<int,vector<int>, cmp> que;
            //去除优先队列中的重复元素 
            set<int> newSet;
            //初始情况下 
            que.push(1);
            newSet.insert(1);
            int count = 0;
            int ret = 0;
            int temp = 0;
            while (true)
            {
                temp = que.top();
                
                out<<temp<<endl;
                
                //如果没有寻找到这个值,说明还没有被加入过,所以加入 
                count++;
                if (count >= index)
                {
                    ret = temp;
                    break;
                }
                //丑数肯定是之前的丑数*2,*3,*5构成的 
                if (newSet.find(temp * 2) == newSet.end())
                {
                    que.push(temp * 2);
                    newSet.insert(temp * 2);
                } 
                if (newSet.find(temp * 3) == newSet.end())
                {
                    que.push(temp * 3);
                    newSet.insert(temp * 3);
                }
                if (newSet.find(temp * 5) == newSet.end())
                {
                    que.push(temp * 5);
                    newSet.insert(temp * 5);
                }
                que.pop();
                if (que.empty())
                {
                    break;
                }
            }
            if (out.is_open())
            {
                out.close();
            }
            return ret;
        }
    };
    int main()
    {
        cout<<Solution().GetUglyNumber_Solution(1500)<<endl;
        return 0;
    }

    代码一:

    #include<iostream>
    using namespace std;
    bool isUglyNumber(int number)
    {
        while (number % 5 == 0)
        {
            number /= 5;
        }
        while (number % 3 == 0)
        {
            number /= 3;
        }
        while (number % 2 == 0)
        {
            number /= 2;
        }
        if (number == 1)
        {
            return true;
        } else {
            return false;
        }
    }
    class Solution {
    public:
        int GetUglyNumber_Solution(int index) {
            int count = 1;
            int ret = 1;
            int temp = 2;
            while (count < index)
            {
                if (isUglyNumber(temp))
                {
                    count++;
                }
                if (count == index)
                {
                    ret = temp;
                }
                temp++;
            }
            return ret;
        }
    };
    int main()
    {
        cout<<Solution().GetUglyNumber_Solution(7)<<endl;
        return 0;
    }
  • 相关阅读:
    【例题 8-11 UVA-10954】Add All
    【例题 8-10 UVA
    【BZOJ1226】学校食堂Dining(状压DP)
    【Tyvj1601】魔兽争霸(主席树,树套树)
    【BZOJ3504】危桥(最大流)
    【BZOJ1812】riv(多叉树转二叉树,树形DP)
    【Vijos1412】多人背包(背包DP)
    【Codevs1907】方格取数3(最小割)
    【Codevs1227】方格取数2(费用流)
    【Tyvj1982】武器分配(费用流)
  • 原文地址:https://www.cnblogs.com/adamhome/p/7921998.html
Copyright © 2020-2023  润新知