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();//数组的最后一个元素就是答案。

    }
};





猜你喜欢

转载自www.cnblogs.com/make-big-money/p/12330635.html