如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人的经验 ,比如准备简历实习校招总结offer选择也欢迎来一起参加秋招打卡活动 等;如果你是计算机小白,学习/转行/校招路上感到迷茫或者需要帮助,可以点此联系阿秀;免费分享阿秀个人学习计算机以来的收集到的好资源,点此白嫖;如果你需要《阿秀的学习笔记》网站中求职相关知识点的PDF版本的话,可以点此下载

# 264. 丑数 II

力扣原题链接(点我直达) (opens new window)

编写一个程序,找出第 n 个丑数。

丑数就是只包含质因数 2, 3, 5正整数

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
1
2
3

说明:

  1. 1 是丑数。
  2. n 不超过1690。

# 第一版,暴力法,超时,方法是对的

int nthUglyNumber(int n) {
	if (n == 1) return 1;
	int index = 2,temp=2;
	while (index) {
		temp = index;
		while (temp != 1) {
			if (temp % 2 == 0) temp >>= 1;
			else if (temp % 3 == 0) temp /= 3;
			else if (temp % 5 == 0) temp /= 5;
			else break;
		}

		if (temp == 1) n--;
		if (n == 1)
		{
			break;

		}
		else
			index++;

	}
	return index;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

1

# 第二版,看的思路,三指针法,真的天才

1-6肯定都是丑数,所以当丑数数量小于7个时直接返回数量

执行用时 :8 ms, 在所有 cpp 提交中击败了89.97%的用户

内存消耗 :9.7 MB, 在所有 cpp 提交中击败了71.64%的用户

int nthUglyNumber(int n) {
	if (n < 1) return n;
	vector<int> dp(n, 0);
	dp[0] = 1;
	int indexTwo = 0, indexThree = 0, indexFive = 0;
	for (int i = 1; i < n; ++i) {
		int minNum = min(min(dp[indexTwo] * 2, dp[indexThree] * 3), dp[indexFive] * 5);
		if (minNum == dp[indexTwo] * 2) indexTwo++;
		if (minNum == dp[indexThree] * 3) indexThree++;
		if (minNum == dp[indexFive] * 5) indexFive++; 

		dp[i] = minNum;

	}
	return dp[n-1];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16