/**
* 思路:贪心+位运算
* 对于偶数使用右移运算符实现除以2然后统计次数即可。
* 对于奇数需要考虑是加一和减一哪个需要的次数更少:
* 将数化为二进制,而将数最后化为 1.就是尽可能减少二进制中的 1 。
* 注意:奇数二进制最低位全是 1,偶数最低位全是 0
*
* 如果低位和次低位都是 1,加上 1 会连续消去多个二进制中的 1,
* 然后在前面补一位 1,在最低位到补的这一个 1 之间都是 0,
* 可以直接通过不断右移得到。而如果在这种情况下 -1,
* 之后每右移 1 位后都会遇到这些连续的 1,
* 这样每右移一位后都会比之前多一步减 1 的操作。
* 次低位是 0,就减去 1
* 唯一特例:3。只有 3 的时候,是直接 -1 最优。
*
* @auther start
* @create 2024-01-11 10:27
*/
//贪心:位运算:尽可能去掉1,奇数最后一位都是1,偶数最后一位都是0
public int integerReplacement(int _n) {
long n = _n;
int ans = 0;
while (n != 1) {
//偶数情况连续除以2
if (n % 2 == 0) {
n >>= 1;
} else { //奇数情况判断次低位是否为1,并且不为3直接加一。
if (n != 3 && ((n >> 1) & 1) == 1) n++;
else n--;
}
ans++;
}
return ans;
}
【贪心+位运算】整数替换
最新推荐文章于 2024-08-30 11:28:00 发布
该篇文章介绍了如何使用贪心策略和位运算技巧计算整数替换操作中1的最小次数。对于偶数,通过右移除以2;奇数则考虑次低位,非3时选择加一或减一以减少1的个数。
摘要由CSDN通过智能技术生成