397. 整数替换
题目描述:
给定一个正整数 n ,你可以做如下操作:
如果 n 是偶数,则用 n / 2替换 n 。
如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。
n 变为 1 所需的最小替换次数是多少?
示例 1:
输入:n = 8
输出:3
解释:8 -> 4 -> 2 -> 1
示例 2:
输入:n = 7
输出:4
解释:7 -> 8 -> 4 -> 2 -> 1
或 7 -> 6 -> 3 -> 2 -> 1
示例 3:
输入:n = 4
输出:2
提示:
1 <= n <= 231 - 1
题解思路
贪心算法
每一步都寻找最优的操作来记录对n的操作
当n为偶数时候:
- 直接进行n//2操作
当n不为偶数时候
-
n%4==1时 将n改为(n-1)/2为最优操作
如果非要将n变为(n+1)/2 才可以得到最优解的话 那么因为(n+1)/2 为奇数 如果下一步进行-1再/2的操作话 得到(n-1)/4 而对(n-1)/2 直接进行/2操作就可以得到 如果下一步进行+1再/2的操作话 得到(n+3)/4 而对于(n-1)/2 进行/2再+1的操作也可以同样得到 所以说当n%4==1的时候 将n改为(n-1)/2 为最优的操作
-
n%4==3 将n改为(n+1)/2为最优操作
如果非要将n变为(n-1)/2 才可以得到最优解的话 那么因为(n-1)/2 为奇数 如果下一步进行-1再/2的操作话 得到(n-3)/4 而对(n+1)/2 进行/2再-1的操作就可以得到 如果下一步进行+1再/2的操作话 得到(n+1)/4 而对于(n+1)/2 进行/2 的操作也可以同样得到 所以说当n%4==1的时候 将n改为(n-1)/2 为最优的操作
特别的
如果当n%4==3
当这时候的n为3时
直接将n-1 再 /2
题解代码:
class Solution:
def integerReplacement(self, n: int) -> int:
ans=0
while n!=1:
if n%2==0:
ans+=1
n//=2
elif n%4==1:
ans+=2
n=(n-1)/2
else:
if n==3:
ans+=2
n=1
else:
ans+=2
n=(n+1)/2
来源
https://leetcode-cn.com/problems/integer-replacement/solution/zheng-shu-ti-huan-by-leetcode-solution-swef/