【LeetCode】2749. 得到整数零需要执行的最少操作数 - 实践
题目描述

题目分析
根据题目描述,需要计算n
u
m
1
−
(
2
i
+
n
u
m
2
)
num_1-(2^i+num_2)num1−(2i+num2)经过多少次运算可以变成0。
进一步列等式,假设,最少经过n
nn次,可以得到值为0
- a 0 − 2 x 1 − b = a 1 a_0-2^{x_1}-b=a_1a0−2x1−b=a1
- a 1 − 2 x 2 − b = a 2 a_1-2^{x_2}-b=a_2a1−2x2−b=a2
- . . . ......
- a n − 2 x n − b = 0 a_n-2^{x_n}-b=0an−2xn−b=0
合并为a 0 − n b = 2 x 1 + 2 x 2 + . . . + 2 x n a_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],则2 x 1 + 2 x 2 + . . . + 2 x n ≥ n 2^{x_1}+2^{x_2}+...+2^{x_n} \geq n2x1+2x2+...+2xn≥n。
首先,等式要成立,a
0
−
n
b
≥
n
a_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的数,即等式成立
所以,可以测得一个判断条件,a 0 − n b ≥ n a n d b i t s ( a 0 − n b ) ≤ n a_0-nb\geq n \ and \ bits(a_0-nb) \leq na0−nb≥nandbits(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;
}
};

浙公网安备 33010602011771号