zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    java-多态
    java-继承
    java-访问修饰符
    mysql基础入门
    子查询
    多表查询
    mysql表(多对多)
    myslql主外键约束
    Sql语句分类
    Redis的一些介绍
  • 原文地址:https://www.cnblogs.com/xgbt/p/13547919.html
Copyright © 2011-2022 走看看