397 整数替换
题目描述
给定一个正整数 n ,你可以做如下操作:
如果 n 是偶数,则用 n / 2替换 n 。 如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。 n 变为 1 所需的最小替换次数是多少?
示例 1:
输入:n = 8 输出:3 解释:8 -> 4 -> 2 -> 1
题解 我原本想用递归
偶数: retuen f(n / 2) + 1
奇数:retuen min(f(n + 1), f(n - 1)) + 1;
很不幸,栈溢出了,我又用数组改递推了,又很不幸内存爆了
看了题解,这道题有点厉害,其实就是转换二进制,怎么最快取到第一位数1,偶数可以直接直接除2,奇数到底是加1还是减1,其实要看最后两位是11 还是 01,11可以加1,01,可以减1,11直接消除了两个1,01,1的数量不变,除以2直接还是要面临位数是1的结局,转换明显变多了
public int integerReplacement(long n) {
int count = 0;
while (n > 1) {
if (n % 2 == 0) {
n = n / 2;
count++;
} else {
if ((n & 0x3) == 3 && n != 3) {
n = n + 1;
count++;
} else {
n = n - 1;
count++;
}
}
}
return count;
}
评论区