• 62. 丑数


    相关知识点:

    1.

    (1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
    (2)vector<int> a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
    (3)vector<int> a(b); //用b向量来创建a向量,整体复制性赋值
    (4)vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素
    (5)int b[7]={1,2,3,4,5,9,8};vector<int> a(b,b+7); //从数组中获得初值

    2.

    while(n--){ };循环n次
    while(--n){ };  循环n-1次

    3.

    //返回a的最后一个元素
    a.back();
    //返回a的第一个元素
    a.front();
    //返回a的第i元素,当且仅当a存在
    a[i];

    4.求3个数的最小值
    错误:min(q[i]*2,q[j]*3,q[k]*5);
    正确:min(q[i]*2,min(q[j]*3,q[k]*5));
    
    
    
     

     思路:

        定义一个数组,用于按顺序保存已经找到的丑数,再定义三个指针p2, p3, p5,其中p2指向数组中第一个
        乘以2之后会比当前数组中末尾元素要大的数字;p3和p5同理。这样,当p2 * 2之后就会比当前最后一个
        丑数要大,而当p3 * 3 之后也会比最后一个丑数要大, p5同理。这样,当前最后一个丑数之后的第一个
        丑数就出现在p2 * 2, p3 * 3, p5 * 5之间,我们只需要比较这三个数的大小即可找到下一个丑数。
        注意每找到一个这样的丑数之后我们就要更新p2, p3, p5,直到我们找到足够多的丑数。
        这种方法是以空间换时间,我们维护了一个长度为n的数组,并最终返回这个数组的末尾元素。

    class Solution {
    public:
        int getUglyNumber(int n) {


            vector<int> q(1,1);//初始化化一个长度为1,初始值为1的数组
            int i =0,j=0,k=0;//定义3个指针
            while(--n)//第一个数已经有了,要求第n个数,还要计算n-1次
            {
               int t = min(q[i]*2,min(q[j]*3,q[k]*5));
               q.push_back(t);
               //每次看一下这3个指针有没有和我最小值相同的,如果相同,则把指针向后移动一位
               if(q[i]*2 == t) i++;
               if(q[j]*3 == t) j++;
               if(q[k]*5 == t) k++;
               
            }
            return q.back();//数组的最后一个元素就是答案。

        }
    };



    另一种代码
    链接:https://www.nowcoder.com/questionTerminal/6aa9e04fc3794f68acf8778237ba065b?f=discussion
    来源:牛客网
    
    class Solution {
    public://别人的代码就是精简,惭愧啊,继续学习。
        int GetUglyNumber_Solution(int index) {
            if (index < 7)return index;
            vector<int> res(index);
            res[0] = 1;
            int t2 = 0, t3 = 0, t5 = 0, i;
            for (i = 1; i < index; ++i)
            {
                res[i] = min(res[t2] * 2, min(res[t3] * 3, res[t5] * 5));
                if (res[i] == res[t2] * 2)t2++;
                if (res[i] == res[t3] * 3)t3++;
                if (res[i] == res[t5] * 5)t5++;
            }
            return res[index - 1];
        }
    };
    
    
    
    



    带女朋友搬家新家条件不好,累到女朋友了,让女朋友受苦了,特此明志:每天学习,明年这个时候(20190812)让女朋友住上大房子,永远年轻,永远热泪盈眶,很多人都是这样,他们都把自己当成身在梦中一样,浑浑噩噩地过日子,只有痛苦或爱或危险可以让他们重新感到这个世界的真实。
  • 相关阅读:
    JAVA多线程2 锁
    IE8标准模式下VML不能显示问题
    JAVA多线程1
    JAVA判断32位还是64位,调用不同的DLL
    JNA调用DLL
    如何提高执行力
    httpClient多线程请求
    【NodeJS】安装
    [转载]一个项目涉及到的50个Sql语句(整理版)
    resultMap中的collection集合出现只能读取一条数据的解决方法
  • 原文地址:https://www.cnblogs.com/make-big-money/p/12330635.html
Copyright © 2020-2023  润新知