相关知识点:
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();//数组的最后一个元素就是答案。
}
};