算法思路
- 多路归并可以看做归并算法的延伸
- 假设我们有m个需要归并的已经排好序的序列,我们需要求合并后的数组,或者合并后数组的多少位,这种时候我们需要用多路归并算法
多路归并算法的思想就是,有m个指针分别指向序列的起始位置,然后我比较m个数,选出m个数中的最小值,然后把该最小值对应的序列指针往后挪一位,直到算法结束
Acwing. 62 丑数
题目描述
我们把只包含质因子2、3和5的数称作丑数(Ugly Number)
例如6、8都是丑数,但14不是,因为它包含质因子7
求第n个丑数的值算法实现
这里的多路归并是2丑数序列,3丑数序列和5*丑数序列的多路归并
class Solution {
public:
int getUglyNumber(int n) {
int i = 0, j = 0, k = 0, cnt = n;
vector<int> ugly_number;
ugly_number.push_back(1);
while (cnt --) {
if (ugly_number[i] * 2 <= ugly_number[j] * 3 && ugly_number[i] * 2 <= ugly_number[k] * 5) {
ugly_number.push_back(ugly_number[i] * 2);
} else if (ugly_number[j] * 3 <= ugly_number[i] * 2 && ugly_number[j] * 3 <= ugly_number[k] * 5) {
ugly_number.push_back(ugly_number[j] * 3);
} else {
ugly_number.push_back(ugly_number[k] * 5);
}
if (ugly_number.back() % 2 == 0) {
i ++;
}
if (ugly_number.back() % 3 == 0) {
j ++;
}
if (ugly_number.back() % 5 == 0) {
k ++;
}
}
return ugly_number[n - 1];
}
};