题解 | 丑数
丑数
https://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param index int整型 * @return int整型 */ int GetUglyNumber_Solution(int index) { // write code here if(index<=0)return 0;//简单错误处理 vector<long long> uglyNums; uglyNums.push_back(1); int t2 = 0, t3 = 0, t5 = 0; int cnt = 1; while(cnt<index){ ++cnt; long long curMax = uglyNums.back(); long long nextMax = min(min(uglyNums[t2]*2, uglyNums[t3]*3), uglyNums[t5]*5); uglyNums.push_back(nextMax); while(uglyNums[t2]*2<=nextMax) ++t2; while(uglyNums[t3]*3<=nextMax) ++t3; while(uglyNums[t5]*5<=nextMax) ++t5; } return uglyNums.back(); } };
只要确保不是大数问题,数字又很大就开long long吧。
确定我们下一次选择的值会比当前最大丑数大,所以所有的选择都要往后走到合适位置(显然在最后一个之前,所以无需验证越界)
然后从比当前最大丑数大的三个可能性中选,选好后更新3个选择点。
主要是解决了重复问题。