【LeetCode】2749. 得到整数零需要执行的最少操作数
2749. 得到整数零需要执行的最少操作数
题目描述
题目分析
根据题目描述,需要计算num1−(2i+num2)num_1-(2^i+num_2)num1−(2i+num2)经过多少次运算可以变成0。
进一步列等式,假设,最少经过nnn次,可以得到值为0
- a0−2x1−b=a1a_0-2^{x_1}-b=a_1a0−2x1−b=a1
- a1−2x2−b=a2a_1-2^{x_2}-b=a_2a1−2x2−b=a2
- .........
- an−2xn−b=0a_n-2^{x_n}-b=0an−2xn−b=0
合并为a0−nb=2x1+2x2+...+2xna_0-nb=2^{x_1}+2^{x_2}+...+2^{x_n}a0−nb=2x1+2x2+...+2xn,其中x∈[0,60]x \in [0,60]x∈[0,60],则2x1+2x2+...+2xn≥n2^{x_1}+2^{x_2}+...+2^{x_n} \geq n2x1+2x2+...+2xn≥n。
首先,等式要成立,a0−nb≥na_0-nb\geq na0−nb≥n,如果左边小于n,则无论如何都不可能满足。
再次,从二进制角度来分析等式左右两边等于的可能性
- n=1,右边最多只有一个1,而左边有可能1的数量不定
- n=2,右边最多只有两个1,可以表示,有1或2个1的数
- n=3,右边最多只有三个1,可以表示,有1、2或3个1的数
- .........
- 可得,n个1,可以表示存在1,2,...,n{1,2,...,n}1,2,...,n个1的数,即等式成立
所以,可以测得一个判断条件,a0−nb≥nandbits(a0−nb)≤na_0-nb\geq n \ and \ bits(a_0-nb) \leq na0−nb≥n and bits(a0−nb)≤n,即等式成立,代表最少n次可以满足题目条件
代码
class Solution {
public:int makeTheIntegerZero(int num1, int num2) {long long num = num1-(long long)num2;if(num < 0) return -1;int len=0;for(int i=1;true;i++){ if(num< i) return -1;if(num>=i && __builtin_popcountll(num) <= i) return i;num -= (long long)num2; if(num < 0) return -1;}return -1; }
};