0397. 整数替换
大约 2 分钟
---
0397. 整数替换
- 标签:贪心、位运算、记忆化搜索、动态规划
- 难度:中等
题目链接
题目大意
描述:
给定一个正整数 ,你可以做如下操作:
- 如果 是偶数,则用 替换 。
- 如果 是奇数,则可以用 或 替换 。
要求:
返回 变为 所需的「最小替换次数」。
说明:
- 。
示例:
- 示例 1:
输入:n = 8
输出:3
解释:8 -> 4 -> 2 -> 1- 示例 2:
输入:n = 7
输出:4
解释:7 -> 8 -> 4 -> 2 -> 1
或 7 -> 6 -> 3 -> 2 -> 1解题思路
思路 1:贪心算法
这道题的核心思想是:对于奇数 ,选择能更快减少二进制表示中 的个数的操作。
解题步骤:
- 偶数处理:如果 是偶数,直接除以 ,即 。
- 奇数处理:如果 是奇数,需要选择 或 :
- 如果 ,直接返回 (已经到达目标)。
- 如果 ,选择 (特殊情况)。
- 如果 的二进制表示末尾是 (即 ),选择 。
- 否则选择 。
关键点:
- 对于偶数,除以 是最优选择,因为能直接减少一位。
- 对于奇数,我们希望尽可能快地减少二进制表示中 的个数。
- 当 时, 会产生更多的连续 ,有利于后续的除法操作。
- 特殊情况: 时, 比 更优。
算法正确性:
设 表示将 变为 的最小操作次数:
- 当 为偶数时:。
- 当 为奇数时:
- 如果 :。
- 如果 :。
- 如果 :选择 能更快地减少 的个数。
- 否则:选择 是更优的。
思路 1:代码
class Solution:
def integerReplacement(self, n: int) -> int:
count = 0
while n != 1:
if n % 2 == 0:
# 偶数:直接除以2
n //= 2
else:
# 奇数:根据情况选择+1或-1
if n == 3:
# 特殊情况:3 -> 2 -> 1 比 3 -> 4 -> 2 -> 1 更优
n -= 1
elif n % 4 == 3:
# 如果n mod 4 = 3,选择+1能产生更多连续的0
n += 1
else:
# 否则选择-1
n -= 1
count += 1
return count思路 1:复杂度分析
- 时间复杂度:,每次操作至少将 减半,最多需要 次操作。
- 空间复杂度:,只使用了常数额外空间。