5481. 得到目标数组的最少函数调用次数. 位运算

给你一个与 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;
    }
};
posted @ 2020-08-23 00:48  _西瓜不甜  阅读(175)  评论(0编辑  收藏  举报