leecode 解题总结:264. Ugly Number II

来源:互联网 发布:java opencv 人脸比对 编辑:程序博客网 时间:2024/06/05 15:52
#include <iostream>#include <stdio.h>#include <vector>#include <string>using namespace std;/*问题:Write a program to find the n-th ugly number.Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.Note that 1 is typically treated as an ugly number, and n does not exceed 1690.分析:实际上是求第n个丑数,丑数从1开始。我们假设当前丑数候选者为{2,3,5},如何从当前候选者中确定下一个丑数,可以将候选丑数去乘以2,乘以3,乘以5,选择其中最小的比如{2,3,5}都乘以2{4,6,10} 从这个里面选择一个最小的作为a                 3{6,9,15}                             b 5{10,15,25}                           c 从{a,b,c}中选择最小的作为丑数,假设为a,更新每一个候选丑数,使得候选丑数>a,候选丑数变成{ , b,c} 更一般的情况当前丑数为{a,b,c},如何产生下一个丑数,输出:123456789101690输出:123456891012关键:1 丑数=三指针问题。需要设定一个指针不断指向已经生成的丑数序列,第一个指针指向的数字用于每次乘以3和当前丑数比较;第二个指针指向的数字每次乘以5和当前丑数比较;第三个指针指向的数字乘以5和当前丑数比较。避免丢失某些丑数2每次选取3个候选丑数中的最小值,然后更新3个指针使其指向的数乘以对应的2或3或5都大于当前丑数。候选丑数也是从3个指针分别乘以2,3,5来计算3溢出错误while(uglyNums.at(index2) * 2 <= cand){index2++;}vector<long long> uglyNums;//防止乘以2或3或5后溢出,所以用long long*/class Solution {public:int minNum(int a, int b, int c){return min( min(a,b) , min(b,c) );}    int nthUglyNumber(int n) {//前5个丑数就是该数字本身if(n <= 0){return 0;}vector<long long> uglyNums;//防止乘以2或3或5后溢出,所以用long longuglyNums.push_back(1);int index2 = 0;//用于乘以2的丑数指针int index3 = 0;int index5 = 0;int count = 0;while(count < n){long long cand = minNum(uglyNums.at(index2) * 2 , uglyNums.at(index3) * 3 , uglyNums.at(index5) * 5 );//压入当前丑数uglyNums.push_back(cand);while(uglyNums.at(index2) * 2 <= cand){index2++;}while(uglyNums.at(index3) * 3 <= cand){index3++;}while(uglyNums.at(index5) * 5 <= cand){index5++;}count++;}if(uglyNums.empty()){return 0;}else{return  uglyNums.at(n-1);}    }};void print(vector<int>& result){if(result.empty()){cout << "no result" << endl;return;}int size = result.size();for(int i = 0 ; i < size ; i++){cout << result.at(i) << " " ;}cout << endl;}void process(){ int num; Solution solution; while(cin >> num ) { int result = solution.nthUglyNumber(num); cout << result << endl; }}int main(int argc , char* argv[]){process();getchar();return 0;}

0 0