My 16ms C++ DP solution with short explanation
We have an array k of first n ugly number. We only know, at the beginning, the first one, which is 1. Then\n\nk[1] = min( k[0]x2, k[0]x3, k[0]x5). The answer is
We have an array *k* of first n ugly number. We only know, at the beginning, the first one, which is 1. Then\n\nk[1] = min( k[0]x2, k[0]x3, k[0]x5). The answer is k[0]x2. So we move 2's pointer to 1. Then we test:\n\nk[2] = min( k[1]x2, k[0]x3, k[0]x5). And so on. Be careful about the cases such as 6, in which we need to forward both pointers of 2 and 3. \n\nx here is multiplication.\n\n    class Solution {\n    public:\n        int nthUglyNumber(int n) {\n            if(n <= 0) return false; // get rid of corner cases \n            if(n == 1) return true; // base case\n            int t2 = 0, t3 = 0, t5 = 0; //pointers for 2, 3, 5\n            vector<int> k(n);\n            k[0] = 1;\n            for(int i  = 1; i < n ; i ++)\n            {\n                k[i] = min(k[t2]*2,min(k[t3]*3,k[t5]*5));\n                if(k[i] == k[t2]*2) t2++; \n                if(k[i] == k[t3]*3) t3++;\n                if(k[i] == k[t5]*5) t5++;\n            }\n            return k[n-1];\n        }\n    };
['Dynamic Programming', 'C++']