给你一个与 nums 大小相同且初始值全为 0 的数组 arr ,请你调用以上函数得到整数数组 nums 。
请你返回将 arr 变成 nums 的最少函数调用次数。
答案保证在 32 位有符号整数以内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-numbers-of-function-calls-to-make-target-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入:nums = [1,5]
输出:5
解释:给第二个数加 1 :[0, 0] 变成 [0, 1] (1 次操作)。
将所有数字乘以 2 :[0, 1] -> [0, 2] -> [0, 4] (2 次操作)。
给两个数字都加 1 :[0, 4] -> [1, 4] -> [1, 5] (2 次操作)。
总操作次数为:1 + 2 + 2 = 5 。
观察得到规律,最终答案为数组中每个数字需要减1的次数(即二进制下1的个数)加上所有数字中最多需要乘几次2的次数。
__builtin_popcount(num)
即求出该数字载二进制下1的个数
1 << i
即2的i次方
class Solution {
public:
int minOperations(vector<int>& nums) {
int best = 0;
int ans = 0;
for (int num: nums) {
ans += __builtin_popcount(num);
best = max(best, num);
}
for (int i = 29; i >= 0; --i) {
if (best & (1 << i)) {
ans += i;
break;
}
}
return ans;
}
};